poj 1330
模板题。
LCA(u)
{
Make-Set(u)
ancestor[Find-Set(u)]=u
对于u的每一个孩子v
{
LCA(v)
Union(u)
ancestor[Find-Set(u)]=u
}
checked[u]=true
对于每个(u,v)属于P
{
if checked[v]=true
then {
回答u和v的最近公共祖先为 ancestor[Find-Set(v)]
}
}
}
代码:
#include<iostream>
#include<fstream>
using namespace std;
struct e{
int data;
e *next;
}edge[10001];
int f[10001],rank[10001],an[10001],x,y,v[10001];
int father(int s){
if(s!=f[s])
f[s]=father(f[s]);
return f[s];
}
void unionset(int s,int t){
int i,j;
i=father(s),j=father(t);
if(rank[i]<rank[j])
f[i]=j;
else
{
f[j]=i;
if(rank[i]==rank[j])
rank[i]++;
}
}
void solve(int s){
f[s]=s;
rank[s]=0;
an[s]=s;
e *p=edge[s].next;
while(p){
solve(p->data);
unionset(s,p->data);
an[father(s)]=s;
p=p->next;
}
v[s]=1;
if(s==x)
{
if(v[y])
cout<<an[father(y)]<<endl;
}
if(s==y)
if(v[x])
cout<<an[father(x)]<<endl;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,n;
int K;
cin>>K;
while(K--)
{
memset(edge,0,sizeof(edge));
memset(v,0,sizeof(v));
cin>>n;
for(i=1;i<=n-1;i++)
{
cin>>j>>k;
e *p=new e;
p->data=k;
p->next=edge[j].next;
edge[j].next=p;
v[k]=1;
}
cin>>x>>y;
for(i=1;;i++)
if(v[i]==0) break;
memset(v,0,sizeof(v));
solve(i);
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号