zoukankan      html  css  js  c++  java
  • hdu 1116 欧拉回路+并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1116

    给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思。但是如果有多个重复的单词时,也必须满足这样的条件才能算YES。否则都是不可能的情况。


    欧拉回路和欧拉通路的判定可以总结为如下:
    1)所有的点联通
    2)欧拉回路中所有点的入度和出度一样。
    3)欧拉通路中起点的入度 - 出度 = 1,终点的 初度 - 入度 = 1, 其他的所有点入度 = 出度;

    所以用并查集搞就好了

    #pragma comment(linker, "/STACK:36777216")
    #pragma GCC optimize ("O2")
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    #define RD(x) scanf("%d",&x)
    #define RD2(x,y) scanf("%d%d",&x,&y)
    #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define clr0(x) memset(x,0,sizeof(x))
    typedef long long LL;
    #define maxn 30
    int fa[maxn],vis[maxn];
    
    int f(int x){return x == fa[x] ? x:(fa[x]=f(fa[x]));}
    void merge(int x,int y)
    {
        x = f(x),y = f(y);
        if(x != y)
            fa[x] = y;
    }
    int out[maxn],in[maxn],ans[maxn],i,j;
    char s[1000];
    void solve()
    {
        int n;RD(n);
        clr0(out),clr0(in),clr0(vis);
        for(i = 0;i < 26;++i)
            fa[i] = i;
        while(n--){
            scanf("%s",s);
            int x = s[0] - 'a',y = s[strlen(s) - 1] - 'a';
            merge(x,y);
            out[x]++,in[y]++;
            vis[x] = vis[y] = 1;
        }
        int cnt = 0;
        for(i = 0;i < 26;++i)
            if(vis[i] && f(i) == i){
                cnt++;
                if(cnt > 1){ //图不连通
                    puts("The door cannot be opened.");
                    return ;
                }
            }
        for(i = 0;i < 26;++i)
            if(vis[i] && out[i] != in[i]){ //统计入度和出度不相等的点的信息
                ans[cnt++] = i;
            }
        if(cnt == 1 || cnt == 3 && (out[ans[1]] - in[ans[1]] == in[ans[2]] - out[ans[2]]) && abs(in[ans[2]] - out[ans[2]]) == 1)
            puts("Ordering is possible.");
        else
            puts("The door cannot be opened.");
        return;
    }
    int main()
    {
        int _;RD(_);while(_--)
            solve();
        return 0;
    }
    


  • 相关阅读:
    读书计划(2020年秋)
    Hbase 常用Shell命令
    假期第三周总结
    语义分析
    虚拟机安装
    掌握需求过程读后感
    第八周总结
    SLR1分析
    第七周总结
    需求工程阅读笔记(三)
  • 原文地址:https://www.cnblogs.com/zibaohun/p/4046792.html
Copyright © 2011-2022 走看看