LCA,比对着第一篇题解模板做的,全ti求助,定给您点关注
查看原帖
LCA,比对着第一篇题解模板做的,全ti求助,定给您点关注
421128
Addrian楼主2023/7/30 16:31
#include<iostream>
#include<cstring>
using namespace std;
const int N=500010;
int read(){
	int x=0,t=1;
	char a=getchar();
	while(a>'9'||a<'0'){if(a=='-')t=-1;a=getchar();}
	while(a>='0'&&a<='9'){x=x*10+a-'0';a=getchar();}
	return x*t;
}
struct node{
	int wei,nex;
}bian[N<<1];
int head[N];
int n,m,s;
int x,y;
int bs=1;
int lg[N];
int fa[N][22]; //2的20次方是10
int sd[N];
void lian(int a,int b){//邻接表 
	bian[bs].nex=head[a];
	head[a]=bs;
	bian[bs].wei=b;
	bs++;
}
int faf(int now,int fath){
	//cout<<"giao"<<now<<" "<<fath<<endl; 
	fa[now][0]=fath;
	sd[now]=sd[fath]+1;
	for(int i=1;i<=lg[sd[now]];i++){
		fa[now][i]=fa[fa[now][i-1]][i-1];//2^i=(2^(i-1))*(2^(i-1)) 
	}
	for(int i=head[now];i;i=bian[i].nex){
		if(bian[i].wei!=fath){
			faf(bian[i].wei,now);
		}
	}
}
int LCA(int x,int y){
	if(sd[x]<sd[y]){
		swap(x,y);
	}
	while(sd[x]>sd[y]){
		x=fa[x][lg[sd[x]-sd[y]]-1];
	}
	if(x==y){
		return x;
	} 
	for(int i=lg[sd[x]]-1;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i],y=fa[y][i];
		} 
	}
	return fa[x][0]; 
}
int main(){
	n=read();
	m=read();
	s=read(); 
	for(int i=1;i<=n-1;i++){
		x=read();
		y=read();
		lian(x,y);
		lian(y,x);
	}
	for(int i=1;i<=n;i++){
		lg[i]=lg[i/2]+1;//第一个比i这个数大的2的次方 
	}
	faf(s,0);
	for(int i=1;i<=m;i++){
		x=read();
		y=read();
		printf("%d\n",LCA(x,y));
	}
	return 0;
}
2023/7/30 16:31
加载中...