• poj 2513 无向图欧拉路+Trie


    题意:

    给出一些木棍,每个木棍两端有两种颜色,不同的木坤如果首尾颜色相同,那么就可以连接起来,问是否所有的木棍看可以连成一条线?

    分析:

    这题跟Uva10129单词那题几乎是一样的,只不过那题是有向图,因为单词的首尾是固定的嘛!而这题是无向图,无向图的话先判断一下是否是连通图,然后再判断一下每个点的度,如果没有奇度点或者奇度点只有两个那么是可以构成无向欧拉图的。把不同颜色当做不同的点,用Trie树给每种颜色分配一个ID值,来区分不同颜色,然后一根木棍上的两种颜色用并查集连边,最后判断整个图是否连通,如果连通在判断每个点的度。

    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<cstdio>
    using namespace std;
    const int maxnode=5e6+10;
    const int N=500000+10;
    struct Trie
    {
        int ch[maxnode][26];
        int val[maxnode];
        int sz,id;
        void clear(){id=1;sz=1;memset(ch[0],0,sizeof(ch[0]));}
        int idx(char c){return c-'a';}
    
        int insert(const char *s)
        {
            int u=0,n=strlen(s);
            for(int i=0;i<n;i++){
                int c=idx(s[i]);
                if(!ch[u][c]){
                    memset(ch[sz],0,sizeof(ch[sz]));
                    val[sz]=0;
                    ch[u][c]=sz++;
                }
                u=ch[u][c];
            }
            if(val[u]==0)val[u]=id++;
            return val[u];
        }
    
    };
    char a[11],b[11];
    int fa[N],in[N];
    int findfa(int x){return x==fa[x]?x:fa[x]=findfa(fa[x]);}
    Trie trie;
    int main()
    {
        //freopen("f.txt","r",stdin);
        for(int i=0;i<N;i++)fa[i]=i;
        memset(in,0,sizeof(in));
        trie.clear();
        while(~scanf("%s%s",a,b)){
            int ida=trie.insert(a);
            int idb=trie.insert(b);
            in[ida]++;in[idb]++;
            int x=findfa(ida),y=findfa(idb);
            if(x!=y)fa[x]=y;
        }
        int num=0;
        for(int i=1;i<trie.id;i++)if(findfa(i)==i)num++;
        if(num>1){
            printf("Impossible
    ");return 0;
        }
        num=0;
        for(int i=1;i<trie.id;i++)if(in[i]&1)num++;
        if(num==0||num==2)printf("Possible
    ");
        else printf("Impossible
    ");
        return 0;
    }


  • 相关阅读:
    简单背包问题
    拓扑排序
    SPFA--P3905 道路重建
    Floyd--P1119 灾后重建
    Kmp--P3375 【模板】KMP字符串匹配
    练习 后缀数组
    BZOJ1036: [ZJOI2008]树的统计Count(树链剖分)
    BZOJ1503: [NOI2004]郁闷的出纳员(Splay)
    BZOJ2733: [HNOI2012]永无乡(线段树合并)
    BZOJ4196: [Noi2015]软件包管理器(树链剖分)
  • 原文地址:https://www.cnblogs.com/01world/p/5762844.html
Copyright © 2020-2023  润新知