[POJ2513] Colored Sticks
前言
水一篇博客吧
题目
讲解
明显用上一根木棍就相当于从一个颜色所代表的点走到另一个颜色所代表的点
而用上所有木棍,不必构成环即相当于询问无向图中是否存在欧拉路径
用\(Trie\)哈希所有颜色,然后判断即可
判断无向图中是否存在欧拉路径的充要条件是:
1.图连通
2.存在0个或2个度为奇数的点
判断连通性可以用dfs或者并查集实现
代码
int f[MAXN],u,v,d[MAXN];
int findSet(int x)
{
if(f[x] != x) f[x] = findSet(f[x]);
return f[x];
}
struct Trie
{
int ch[26],ID;
}t[MAXN * 10];
int GetID(char *c)
{
int len = strlen(c),now = 0;
for(int i = 0;i < len;++ i)
{
int to = c[i] - 'a';
if(!t[now].ch[to]) t[now].ch[to] = ++cnt;
now = t[now].ch[to];
}
if(!t[now].ID) t[now].ID = ++n;
return t[now].ID;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
for(int i = 1;i <= 500000;++ i) f[i] = i;
while(~scanf("%s %s",a,b))
{
u = GetID(a);v = GetID(b);
d[u]++;d[v]++;
f[findSet(u)] = findSet(v);
}
cnt = 0;
for(int i = 1;i <= n;++ i)
{
if(findSet(1) != findSet(i))
{printf("Impossible");return 0;}
if(d[i] & 1) cnt++;
}
if(cnt && cnt != 2) printf("Impossible");
else printf("Possible");
return 0;
}