POJ1330
筱柒Littleseven
QQ:3534947775
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 10010;
int tot,to[MAXN],nex[MAXN],head[MAXN];
int deep[MAXN],step,fa[MAXN],t,n,root;
void add(int x,int y){ to[++tot]=y; nex[tot]=head[x]; head[x]=tot; }
void dfs(int x,int step)
{
deep[x]=step;
for(int i=head[x]; i; i=nex[i]) dfs(to[i],step+1);
}
void setup()
{
memset(head,0,sizeof head);
memset(to,0,sizeof to);
memset(nex,0,sizeof nex);
memset(deep,0,sizeof deep);
memset(fa,0,sizeof fa);
}
int lca(int x,int y)
{
if(deep[x]<deep[y]) swap(x,y);
while(deep[x]>deep[y]) x=fa[x];
while(x!=y) x=fa[x],y=fa[y];
return x;
}
int main()
{
cin>>t;
for(int i=1; i<=t; i++)
{
int root; setup();
tot=0;
cin>>n;
for(int j=1; j<n; j++)
{
int a,b; cin>>a>>b;
add(a,b); fa[b]=a;
}
for(int k=1; k<=n; k++){ if(!fa[k]) root=k; }
int qa,qb; cin>>qa>>qb; dfs(root,1);
cout<<lca(qa,qb)<<endl;
}
return 0;
}