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;
}

posted on 2011-03-19 11:22  宇宙吾心  阅读(304)  评论(0)    收藏  举报

导航