poj 2513

trie+并查集,并查集判断联通情况。

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n;
int f[500001];
int rank[500001];
int d[500001];

void init(){
	for(int i=1;i<=500000;i++)
	{
		f[i]=i;
		rank[i]=0;
	}
}

int father(int s){
	if(s!=f[s])
		s=father(f[s]);
	return f[s];
}

void unionset(int s,int t){
	int 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]++;
	}
}

struct e{
	int p[30];
	int end;
}tree[5000001];

int state=1;
int build(char c[]){
	int i=1,j=0;
	for(j=0;j<strlen(c);j++)
	{
		if(tree[i].p[c[j]-'a']==0)
			tree[i].p[c[j]-'a']=++state;
		i=tree[i].p[c[j]-'a'];
	}
	if(tree[i].end==0)
		tree[i].end=++n;
	return tree[i].end;
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s;
	int m=0;
	char c[20];
	init();
	while(scanf("%s",c)!=EOF)
	{
		
		i=build(c);
//		cin>>c;
		scanf("%s",c);
		j=build(c);
		d[i]++;
		d[j]++;
		if(i!=j&&father(i)!=father(j))
		{
			unionset(i,j);
			m++;
		}
	}
	if(n==0){
		cout<<"Possible"<<endl;
		return;
	}
	
	
	if(m!=n-1)
		cout<<"Impossible"<<endl;
	else
	{
		k=0;
		for(i=1;i<=n;i++)
			if(d[i]%2)
			{
				k++;
				if(k>=3)
				 break;
			}
		if(i>n)
			cout<<"Possible"<<endl;
		else
			cout<<"Impossible"<<endl;
	}

}

int main(){
	read();
	return 0;
}

posted on 2011-03-09 19:24  宇宙吾心  阅读(189)  评论(0)    收藏  举报

导航