#include <bits/stdc++.h>
using namespace std;
#define maxn 100000 + 10
struct Edge
{
int v;
int next;
} e[maxn<<1];
int head[maxn], cnt;
void adde(int u, int v) //单向边
{
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt++;
}
int root, p[maxn], d[maxn];
void dfs(int v, int P, int D)
{
p[v] = P;
d[v] = D;
for(int i=head[v]; i!=-1; i=e[i].next)
if(e[i].v != P) dfs(e[i].v, v, D+1);
}
void init()
{
dfs(root, -1, 0);
}
int lca(int u, int v)
{
while(d[u] > d[v]) u = p[u];
while(d[v] > d[u]) v = p[v];
while(u != v)
{
u = p[u];
v = p[v];
}
return u;
}
int n;
int main()
{
cnt = 0;
memset(head, -1, sizeof(head));
scanf("%d%d", &n, &root);
for(int i=0; i<n-1; i++)
{
int u, v;
scanf("%d%d", &u, &v);
adde(u, v);
adde(v, u);
}
// for(int i=1; i<=8; i++)
// {
// cout<<i<<" : ";
// for(int j=head[i]; j!=-1; j=e[j].next)
// cout<<e[j].v<<" ";
// cout<<endl;
// }
init();
// for(int i=1; i<=n; i++)
// printf("D[%d] : %d\n", i, d[i]);
int q;
cin>>q;
for(int i=0; i<q; i++)
{
int u, v;
cin>>u>>v;
cout<<lca(u, v)<<endl;
}
return 0;
}
/*
8 1
1 2
1 3
2 4
2 5
3 6
5 7
5 8
3
4 7
8 6
5 8
*/
LCA 最裸版
最新推荐文章于 2021-02-17 17:57:27 发布