30分求助
查看原帖
30分求助
60164
fnoiyhyang楼主2021/9/29 18:16
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=550000,M=30;
int h[N],fa[N][M],dep[N],num,n,m,s,lg[N];
struct node{
	int v,next;
}d[2*N];
void add(int u,int v){
	d[num].v=v;
	d[num].next=h[u];
	h[u]=num++;
}
void dfs(int u,int fath){
	fa[u][0]=fath;
	dep[u]=dep[fath]+1;
	
	//for(int i=1;i<=M;++i)
	for(int i=1;i<=lg[dep[u]];++i)
		fa[u][i]=fa[fa[u][i-1]][i-1];
	
	for(int i=h[u];i!=-1;i=d[i].next)
		if(d[i].v!=fath)
			dfs(d[i].v,u);
}
int LCA(int u,int v){
	if(dep[u]<dep[v])
		swap(u,v);
	
//	for(int i=M;i>=0;--i)
//		if(dep[fa[u][i]]>=dep[v])
//			u=fa[u][i];
	while(dep[u]>dep[v])
		u=fa[u][lg[dep[u]-dep[v]]-1];
	
	if(u==v)return u;
	
	//for(int i=M;i>=0;--i){
	for(int i=lg[dep[u]]-1;i>=0;--i){
		if(fa[u][i]!=fa[v][i]){
			u=fa[u][i];
			v=fa[v][i];	
		}
	}
		
	
	return fa[u][0];
}
int main(){
	//freopen("1.txt","r",stdin);
	scanf("%d%d%d",&n,&m,&s);
	
	num=0;
	memset(h,-1,sizeof h);
	//printf("---");
	for(int i=1;i<n;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		
		add(x,y);
		add(y,x);
	}
	
	for(int i=1;i<=n;++i)
		lg[i]=lg[i-1]+(i<<lg[i-1]==i);
	
	dfs(s,0);
	
	for(int i=1;i<=m;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		
		printf("%d\n",LCA(u,v));
	}
	
	return 0;
}
2021/9/29 18:16
加载中...