https://vjudge.net/problem/POJ-1330
最简单的LCA模板题
刚学了tarjan
练习一下
#include<iostream>
using namespace std;
typedef long long ll;
const int N=2e4+10;
int Next[N],head[N],ver[N],fa[N],tot=0,v[N],a,b,ans,A[N];
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
int get(int x){
if(x==fa[x]) return x;
return fa[x]=get(fa[x]);
}
void tarjan(int x){
v[x]=1;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(v[y]) continue;
tarjan(y);
fa[y]=x;
}
if((a==x&&v[b]==2)){
ans=get(b);
}
if((b==x&&v[a]==2)){
ans=get(a);
}
v[x]=2;
}
int main(){
int T;
cin>>T;
while(T--){
int n;
tot=0;
cin>>n;
for(int i=1;i<=n*2;++i) fa[i]=i,head[i]=0,Next[i]=0,ver[i]=0,v[i]=0,A[i]=0;
for(int i=1;i<n;++i){
cin>>a>>b;
add(a,b);add(b,a);
A[b]++;
}
cin>>a>>b;
for(int i=1;i<=n;++i){
if(A[i]==0){
tarjan(i);
break;
}
}
cout<<ans<<endl;
}
}