• [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;
    }
    
  • 相关阅读:
    【Daily Scrum】11-18:Postmortem of sprint 1
    【Daily Scrum】11-17
    【Daily Scrum】11-14
    【Daily Scrum】11-13
    【Daily Scrum】11-12
    【Daily Scrum】12-04
    【Daily Scrum】12-03
    【Review】Postmortem of Sprint 2 and next planning
    【Daily Scrum】11-28
    【Daily Scrum】11-27
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/13719137.html
Copyright © 2020-2023  润新知