.
1 #include <cstring>
2 #include <cstdio>
3 #include <cstdlib>
4 #include <algorithm>
5 #include <cmath>
6 #include <vector>
7 using namespace std;
8 const int N=10000+5;
9 vector <int> son[N];
10 int T,n,depth[N],fa[N][20],in[N],a,b;
11 void dfs(int prev,int rt){
12 depth[rt]=depth[prev]+1;
13 fa[rt][0]=prev;
14 for (int i=1;i<20;i++)
15 fa[rt][i]=fa[fa[rt][i-1]][i-1];
16 for (int i=0;i<son[rt].size();i++)
17 dfs(rt,son[rt][i]);
18 }
19 int LCA(int x,int y){
20 if (depth[x]<depth[y])
21 swap(x,y);
22 for (int i=19;i>=0;i--)
23 if (depth[x]-(1<<i)>=depth[y])
24 x=fa[x][i];
25 if (x==y)
26 return x;
27 for (int i=19;i>=0;i--)
28 if (fa[x][i]!=fa[y][i])
29 x=fa[x][i],y=fa[y][i];
30 return fa[x][0];
31 }
32 int main(){
33 scanf("%d",&T);
34 while (T--){
35 scanf("%d",&n);
36 for (int i=1;i<=n;i++)
37 son[i].clear();
38 memset(in,0,sizeof in);
39 for (int i=1;i<n;i++){
40 scanf("%d%d",&a,&b);
41 son[a].push_back(b);
42 in[b]++;
43 }
44 depth[0]=-1;
45 int rt=0;
46 for (int i=1;i<=n&&rt==0;i++)
47 if (in[i]==0)
48 rt=i;
49 dfs(0,rt);
50 scanf("%d%d",&a,&b);
51 printf("%d\n",LCA(a,b));
52 }
53 return 0;
54 }