• POJ2513_Colored Sticks_KEY


    题目传送门

    题目大意:给你若干根木棍,每根木棍有前后两种颜色,连接两根木棍需要前后颜色相同,求能否将所有木棍连接在一起。

    Solution:

    不要将木棍看成点,将颜色看成点。

    其实就是求是否存在欧拉路径。

    有欧拉路径要满足两个条件:

      图是连通图。

      没有或只有两个入度为奇数的点。

    判断连通性用并查集。

    枚举每个点判断入度就好了。

    code:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    
    struct trie{
        int tr[1000000][26],v[1000000],cnt,tot;
        trie(){memset(tr,0,sizeof tr),memset(v,0,sizeof v),cnt=tot=0;}
        int add(char *a)
        {
            int len=strlen(a),now=0;
                for(int i=0;i<len;i++){
                    if(!tr[now][a[i]-'a'])tr[now][a[i]-'a']=++cnt;
                    now=tr[now][a[i]-'a'];
                }
            if(!v[now])v[now]=++tot;
            return v[now];
        }
    }T;
    char S1[25],S2[25];
    int into[500005],fa[500005];
    int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);}
    
    int main()
    {
    //    freopen("x.txt","r",stdin);
        for(int i=1;i<=500000;i++)fa[i]=i;
        while(cin>>S1>>S2){
            int k1=T.add(S1),k2=T.add(S2);
            into[k1]++,into[k2]++;
            fa[getf(k1)]=getf(k2);
        }
        int ans=0;
        for(int i=1;i<=T.tot;i++)
            if(fa[getf(i)]==i)ans++;
        if(ans>1)return puts("Impossible"),0;
        ans=0;
        for(int i=1;i<=T.tot;i++){
            if(into[i]&1)ans++;
        }
        if(!ans||ans==2)puts("Possible");
        else puts("Impossible");
        return 0;
    }
  • 相关阅读:
    C语言入门(16)——C语言的数组
    快速插入一百万行数据储存过程
    如何将两个表名对调
    MySQL规范
    MySQL运行环境部署规范
    mysql查看存储过程
    批量杀死MySQL连接的几种方法
    查看堵塞的SQL
    mysqldump备份脚本
    查看当前的数据和索引的总大小
  • 原文地址:https://www.cnblogs.com/Cptraser/p/8566393.html
Copyright © 2020-2023  润新知