[POJ2513] Colored Sticks

前言

水一篇博客吧

题目

POJ

讲解

明显用上一根木棍就相当于从一个颜色所代表的点走到另一个颜色所代表的点

而用上所有木棍,不必构成环即相当于询问无向图中是否存在欧拉路径

\(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;
}
posted @ 2020-09-23 16:14  皮皮刘  阅读(68)  评论(0编辑  收藏  举报