10pts求吊
查看原帖
10pts求吊
754467
f_hxr_楼主2023/4/29 17:00

rt

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
int n,m,s,a,b,f[500005][22];
int head[1000005],nxt[1000005],to[1000005],dep[500005],cnt;
void add(int U,int V){
	nxt[++cnt]=head[U];to[cnt]=V;head[U]=cnt;
	nxt[++cnt]=head[V];to[cnt]=U;head[V]=cnt;
	return;
}
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;f[x][0]=fa;
	for(int i=1;(1<<i)<=dep[x];i++)
		f[x][i]=f[f[x][i-1]][i-1];
	for(int i=head[x];i;i=nxt[i])
		if(to[i]!=fa)dfs(to[i],x);
	return;
}
int LCA(int A,int B){
	if(dep[A]>dep[B])swap(A,B);
	for(int i=20;i>=0;i--)
		if(dep[A]<=dep[B]-(1<<i))
			B=f[B][i];
	if(A==B)return A;
	for(int i=22;i>=0;i--)
		if(f[a][i]!=f[b][i])
			A=f[A][i],B=f[B][i];
	return f[A][0];
}
int main(){
	int n,m,s;
	cin>>n>>m>>s;
	for(int i=1;i<=n-1;i++)
		cin>>a>>b,add(a,b);
	dfs(s,0);
	while(m--){
		cin>>a>>b;
		cout<<LCA(a,b)<<endl;
	}
	return 0;
}
2023/4/29 17:00
加载中...