给x,y 求lca 复杂度O(n) 只计算一次lca则足够了 如果是多对结点需要更优化
int t,n,m,x,y;
vector<int> g[maxn];
int root;
int parent[maxn],depth[maxn];
void dfs(int v,int d){
depth[v] = d;
for(int i=0;i<g[v].size();i++){
dfs(g[v][i],d+1);
}
}
void init(){
dfs(root,0);
}
int lca(int u,int v){
while(depth[u]>depth[v]) u=parent[u];
while(depth[v]>depth[u]) v=parent[v];
while(u!=v){
u=parent[u];
v=parent[v];
}
return u;
}
int main(){
cin>>t;
while(t--){
memset(parent,-1,sizeof(parent));
for(int i=1;i<=n;i++) g[i].clear();
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
g[x].push_back(y);
parent[y] = x;
}
scanf("%d%d",&x,&y);
for(int i=1;i<=n;i++){
if(parent[i] == -1){
root=i;
break;
}
}
init();
printf("%d\n",lca(x,y));
}
return 0;
}