lca过不了样例求调
查看原帖
lca过不了样例求调
349824
WsW_花逝爆零人楼主2023/8/10 23:45
#include<bits/stdc++.h>
using namespace std;
struct point{
	int to;
	int next;
}edge[500001];
int elen;
int head[500001];

int n,m,root;
int u,v;

bool vis[500001];
int f[500001][20];
int dep[500001];

int lg[500001];

void add(int from,int to){
	++elen;
	edge[elen].to=to;
	edge[elen].next=head[from];
	head[from]=elen;
}

void dfs(int cur,int fath){
	if(vis[cur])return ;
	vis[cur]=1;
	f[cur][0]=fath;
	dep[cur]=dep[fath]+1;
	for(int i=1;i<=lg[dep[cur]];i++){
		f[cur][i]=f[f[cur][i-1]][i-1];
	}
	for(int i=head[cur];i;i=edge[i].next){
		dfs(edge[i].to,cur);
	}
}

int lca(int a,int b){
	if(dep[a]>dep[b])swap(a,b);
	while(dep[a]<dep[b]){
		b=f[b][lg[dep[b]-dep[a]]-1];
	}
	if(a==b)return a;
	for(int i=lg[dep[a]]-1;i>=0;i--){
		if(f[a][i]!=f[b][i]){
			a=f[a][i];
			b=f[b][i];
		}
	}
	return f[a][0];
}

int main(){
	
	scanf("%d%d%d",&n,&m,&root);
	for(int i=1;i<n;i++){
		scanf("%d%d",&u,&v);
		add(v,u);
		add(u,v);
	}
	
	lg[0]=-1;
	for(int i=1;i<=n;i++){
		lg[i]=lg[i>>1]+1;
	}
	
	dfs(root,0);
	
	while(m--){
		scanf("%d%d",&u,&v);
		printf("              %d\n",u,v);
	}
	
	return 0;
}
2023/8/10 23:45
加载中...