P3379 【模板】最近公共祖先(LCA)70分RE
  • 板块题目总版
  • 楼主ma_niu_bi
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/6/29 14:28
  • 上次更新2023/10/27 22:21:34
查看原帖
P3379 【模板】最近公共祖先(LCA)70分RE
528917
ma_niu_bi楼主2022/6/29 14:28
#include<cstdio>
#include<cmath>
#define MAXN 500000+10000
#define MAXLOG 200
int ver[MAXN*2],next[MAXN*2],head[MAXN*2],tot,n,m,s;
inline void add(int x,int y){
	ver[++tot]=y;
	next[tot]=head[x];
	head[x]=tot;
} 
int de[MAXN],vis[MAXN],f[MAXN][MAXLOG];
inline void dfs(int i,int d,int father){
	de[i]=d;
	f[i][0]=father;
	for(int j=1;j<=log2(d);j++)
		f[i][j]=f[f[i][j-1]][j-1];
	for(int j=head[i];j;j=next[j]){
		if(!vis[ver[j]]){
			vis[ver[j]]=1;
			dfs(ver[j],d+1,i);
			vis[ver[j]]=0;
		}
	}
}
inline int getlca(int x,int y){
	if(x==y)return x;
	if(de[x]>de[y]){
		for(int i=log2(x);i>=0;i--){
			if(f[x][i]!=0&&de[f[x][i]]>=de[y]){
				return getlca(f[x][i],y);
			}
		}
	}else if(de[x]<de[y]){
		for(int i=log2(y);i>=0;i--){
			if(f[y][i]!=0&&de[f[y][i]]>=de[x]){
				return getlca(x,f[y][i]);
			}
		}
	}else{
		for(int i=0;i<=log2(x);i++){
			if(f[x][i]==f[y][i]){
				if(i!=0)return getlca(f[x][i-1],f[y][i-1]);
				else return getlca(f[x][0],f[y][0]);
			}
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=n-1;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	vis[s]=1;
	dfs(s,1,0);
	vis[s]=0;
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",getlca(x,y));
	}
	return 0;
} 
2022/6/29 14:28
加载中...