您的位置:首页 > 其它

POJ 2513 Colored Sticks

2010-12-14 13:59 363 查看
解题思路: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: