您的位置:首页 > 其它

POJ 2513 Colored Sticks

2015-02-20 20:57 441 查看
这题是求欧拉路径,给出字符串,map映射会超时,用Trie树来映射。

一个图有欧拉路径的充分必要条件是这个图是连通的且每一个顶点的度都是偶数或者且仅有两个顶点的度是奇数。联通可以用并查集来判断。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int fa[510000],trie[510000][30],dev[510000],id[510000],sz,num;
int getfa(int x)
{
return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
void init()
{
for(int i = 0; i < 510000; i++)
fa[i] = i;
memset(trie,0,sizeof(trie));
memset(dev,0,sizeof(dev));
memset(id,0,sizeof(id));
sz = 1;
num = 0;
}
int Insert(char *s)
{
int cur = 1;
for(int i = 0; s[i]; i++)
{
int c = s[i] - 'a';
if(!trie[cur][c])
{
trie[cur][c] = ++sz;
}
cur = trie[cur][c];
}
dev[cur]++;
if(dev[cur] == 1) id[cur] = ++num;
return id[cur];
}
int main()
{
char s1[15],s2[15];
init();
while(scanf("%s%s",s1,s2)!=EOF)
{
int a = Insert(s1);
int b = Insert(s2);
//printf("%s %s\n",s1,s2);
int x = getfa(a);
int y = getfa(b);
if(x != y) fa[y] = x;
}
if(num == 0)
{
printf("Possible\n");
return 0;
}
int count1 = 0;
for(int i = 1; i <= sz; i++)
{
if(dev[i]&1) count1 ++;//计算度为奇的点的个数。
if(count1 > 2) break;
}
int count2 = 0;
for(int i = 1; i <= num; i++)
if(fa[i] == i) count2++;//count2 == 1说明联通。
if(count2 == 1 && (count1 == 0 || count1 == 2)) printf("Possible\n");
else printf("Impossible\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 欧拉路径