zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    while语句
    闭包
    文件操作
    Python基础九:高级特性
    Python基础八:函数
    Python基础六:字典和集合
    Python基础七:条件判断和循环结构
    Python基础五:列表和元组
    Python基础四:字符串及编码
    Python基础三:数据类型和变量
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/13719137.html
Copyright © 2011-2022 走看看