POJ 2513 Colored Sticks

解题思路:trie树+并查集(判断是否属于同一集合)+欧拉通路判断

代码
#include <iostream>
using namespace std;
#define MAXN 5000001
#define MAXM 500001
char ch1[11],ch2[11],trie[MAXN];
int size,first[MAXN],next[MAXN],place[MAXN];
int n,root[MAXM],deg[MAXM];

int find(int x)
{
if(root[x]!=x)root[x]=find(root[x]);
return root[x];
}
int insert(char ch[])
{
int i, t, p=0,l=strlen(ch);
for(i=0;i<l;i++)
{
t
=first[p];
while (t&&trie[t]!=ch[i])t=next[t];
if(!t)
{
trie[
++size]=ch[i],next[size]=first[p];
first[p]
=size,first[size]=0,p=size;
}
else p=t;
}
if(!place[p])place[p]=++n;
return place[p];
}
int main()
{
int i,r1,r2,r,odd;
bool IsOk;
for(i=0;i<MAXM;i++)root[i]=i;
size
=n=0;
while(scanf("%s%s", ch1, ch2)!=EOF)
{
r1
=insert(ch1),r2=insert(ch2);
deg[r1]
++,deg[r2]++;
r1
=find(r1),r2=find(r2);
if(r1!=r2)root[r2]=r1;
}
for (IsOk=i=1,r=find(1),odd=0;i<n&&IsOk;i++)
{
if(root[i]==i&&i!=r)IsOk=false;
if(deg[i]%2){odd++;if(odd>2)IsOk=false;}
}
IsOk
?printf("Possible\n"):printf("Impossible\n");
return 0;
}

 

posted on 2010-12-14 13:59  ltang  阅读(138)  评论(0编辑  收藏  举报

导航