70ptsRE求调
查看原帖
70ptsRE求调
604906
Guizy楼主2023/7/13 08:01
#include <bits/stdc++.h>
using namespace std;
int v[500010],nxt[500010],final[500010],cnt=0;
bool flag[500010];
int dep[500010],f[500010][31];
void add(int x,int y){
	cnt++;
	v[cnt]=y; 
	nxt[cnt]=final[x];
	final[x]=cnt;
}
void dfs(int node){
	flag[node]=true;
	for(int i=final[node];i;i=nxt[i]){
		if(flag[v[i]]) continue;
		f[v[i]][0]=node;
		dep[v[i]]=dep[node]+1;
		dfs(v[i]);
	}
}
int main(){
	int n,m,s;
	scanf("%d%d%d",&n,&m,&s);
	for(int i=0;i<n-1;i++){ 
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
	}
	dep[s]=1;
	dfs(s);
	for(int c=1;c<=log2(n);c++)
		for(int i=1;i<=n;i++)
			f[i][c]=f[f[i][c-1]][c-1];
	while(m--){
		int a,b;
		scanf("%d%d",&a,&b);
		if(dep[a]<dep[b]) swap(a,b);
		for(int c=log2(n);c>=0;c--)
			if(dep[f[a][c]]>=dep[b])
				a=f[a][c];
		if(a==b){
			printf("%d\n",a);
			continue;
		}
		for(int c=log2(n);c>=0;c--)
			if(f[a][c]!=f[b][c])
				a=f[a][c],b=f[b][c];
		printf("%d\n",f[a][0]);
	}
	return 0;
}
2023/7/13 08:01
加载中...