求助!30分
查看原帖
求助!30分
334041
沉鸣cmh楼主2021/5/8 21:43
#include<bits/stdc++.h>
using namespace std;
int n,m,s,f[500005],o,oo,st[500005][22],d[30],tot;
struct p{
	int n,p;
}a[1000005];
void dfs(int u,int v){st[u][0]=v;
	for(int i=f[u];i;i=a[i].n){if(a[i].p==v)continue;
		d[a[i].p]=d[u]+1;dfs(a[i].p,u);
	}
}
void gst(){for(int i=1;i<=21;i++)for(int j=1;j<=n;j++)st[j][i]=st[st[j][i-1]][i-1];}
void add(int x,int y){
	a[++tot].n=f[x];
	a[tot].p=y;
	f[x]=tot;
}
int lca(int u,int v){
	if(d[u]<d[v])swap(u,v);
	for(int i=0,de=d[u]-d[v];de;i++,de/=2)if(de%2==1)u=st[u][i];
	if(u==v)return u;
	for(int i=21;i>=0;i--)if(st[u][i]!=st[v][i])u=st[u][i],v=st[v][i];
	return st[u][0];
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<n;i++){
		cin>>o>>oo;add(o,oo),add(oo,o);
	}dfs(s,0);gst();
	for(int i=1;i<=m;i++){
		cin>>o>>oo;cout<<lca(o,oo)<<endl;
	}
	return 0;
} 

感觉没错。。。

2021/5/8 21:43
加载中...