还是LCA,注意的地方就是查询u,v时,u和v之间不一定是直接相连的。。。 代码: #include<iostream> #include<cstdio> #include<memory.h> #include<queue> using namespace std; const int MAX=10005; struct node { int v,next; }g[MAX*MAX]; int parent[MAX],ancestor[MAX],adj[MAX],ind[MAX]; bool check[MAX]; int e,n,m,e2,a,b,ans; int find(int x) { if(x!=parent[x]) parent[x]=find(parent[x]); return parent[x]; } void lca(int u) { int i,v; parent[u]=u; ancestor[find(u)]=u; //cout<<ancestor[find(u)]<<endl; for(i=adj[u];i!=-1;i=g[i].next) { v=g[i].v; lca(v); parent[v]=u; ancestor[find(u)]=u; } check[u]=true; if(u==a&&check[b]) ans=ancestor[find(b)]; else if(u==b&&check[a]) ans=ancestor[find(a)]; } int main() { int i,j,T,k; scanf("%d",&T); while(T--) { e=0; memset(adj,-1,sizeof(adj)); memset(ind,0,sizeof(ind)); memset(check,false,sizeof(check)); scanf("%d",&n); for(i=1;i<=n;i++) parent[i]=i; for(k=1;k<n;k++) { scanf("%d%d",&i,&j); g[e].v=j; g[e].next=adj[i]; adj[i]=e++; ind[j]++; } scanf("%d%d",&a,&b); for(i=1;i<=n;i++) if(ind[i]==0) break; lca(i); cout<<ans<<endl; } return 0; }