水题目。直接上代码了。
VIEW CODE
#include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #include<queue> #include<stack> #include<string> #include<cstring> #include<map> #include<vector> #include<set> #include<ctime> #include<stdlib.h> using namespace std; const int mmax= 10010; const int mod=1000000007; typedef long long LL; struct node { int en; int next; }E[2*mmax]; int p[mmax],fa[mmax]; int num; int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } void init() { memset(p,-1,sizeof p); num=0; } void add(int st,int en) { E[num].en=en; E[num].next=p[st]; p[st]=num++; } bool vis[mmax]; int x,y; void Lca(int u) { vis[u]=1; if( ( u==x|| u==y) &&vis[x] && vis[y]) printf("%d\n",find( u==x?y:x ) ); for(int i=p[u];i+1;i=E[i].next) { int v=E[i].en; if(!vis[v]) { Lca(v); fa[v]=u; } } } int main() { int t; cin>>t; while(t--) { int n; init(); scanf("%d",&n); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<n;i++) { int u,v; scanf("%d %d",&u,&v); add(u,v),add(v,u); fa[v]=u; } int root; for(int i=1;i<=n;i++) if(find(i)==i) root=i; scanf("%d %d",&x,&y); memset(vis,0,sizeof vis); for(int i=1;i<=n;i++) fa[i]=i; Lca(root); } return 0; }
时间: 2024-10-07 17:46:46