此题用的是并查集的思路,时间很慢,应该有更好的思路,但以目前的知识只能做成这样
#include <iostream> using namespace std; const int maxn=10001; struct UFSTree { int data; int parent; int rank; }t[maxn]; int N; void init() { int i; for(i=0;i<N;i++) { t[i].data=i; t[i].parent=i; t[i].rank=1; } } void Union(int p,int c) { t[c].parent=p; if(t[p].rank<=t[c].rank) { while(t[p].parent!=t[p].data) { t[p].rank+=t[c].rank; p=t[p].parent; } t[p].rank+=t[c].rank; } } int find(int n1,int n2) { if(t[n1].rank==t[n2].rank) { if(t[n1].data==t[n2].data) return t[n1].data; else return find(t[n1].parent,t[n2].parent); } else if(t[n1].rank<t[n2].rank) return find(t[n1].parent,n2); else return find(n1,t[n2].parent); } int main() { int T; cin>>T; while(T--) { cin>>N; init(); int i,p,c; for(i=0;i<N-1;i++) { cin>>p>>c; Union(p,c); } int n1,n2; cin>>n1>>n2; int oc=find(n1,n2); cout<<oc<<endl; } return 0; }