#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
struct edge{
int v,next;
}e[maxn];
int n;
int q;
int pre[maxn][23];
int d[maxn];
int head[maxn];
int cnt=0;
int father[maxn];
void add(int u,int v){
e[cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt++;
}
void dfs(int node){
for(int i=head[node];i!=-1;i=e[i].next){
int v=e[i].v;
d[v]=d[node]+1;
pre[v][0]=node;
dfs(v);
}
}
int LCA(int x,int y){
if(d[x]<d[y]) swap(x,y);
for(int i=log2(d[x]-d[y]);i>=0;i--){
if((1<<i)<=d[x]-d[y]) x=pre[x][i];
}
if(x==y) return y;
for(int i=log2(d[x]);i>=0;i--){
if(pre[x][i]!=pre[y][i]){
x=pre[x][i];
y=pre[y][i];
}
}
return pre[x][0];
}
int main(){
memset(head,-1,sizeof head);
memset(d,-1,sizeof d);
cin>>n;
for(int i=1;i<=n-1;i++){
int a,b;
cin>>a>>b;
add(a,b);
father[b]++;
}
int p;
for(int i=1;i<=n;i++) if(father[i]==0){
p=i;
break;
}
dfs(p);
for(int i=1;i<=22;i++){
for(int j=1;j<=n;j++){
pre[j][i]=pre[pre[j][i-1]][i-1];
}
}
/*for(int i=1;i<=n;i++){
for(int j=0;j<)
}*/
cin>>q;
for(int i=1;i<=q;i++){
int c,d;
cin>>c>>d;
cout<<LCA(c,d)<<endl;
}
}
计蒜客 节点最近公共祖先
最新推荐文章于 2024-05-20 18:16:07 发布