• UVA10054 The Necklace 欧拉回路+并查集


    题意:n个珠子,每个珠子的两半由不同的颜色组成。 只有相同的颜色才能接在一起, 问能否组成一个一个项链并输出。

    题解:把每个颜色看成一个点,就是判断欧拉回路

    无向图欧拉回路:度为偶数的连通图(并查集)

    输出路径:递归输出路径

    #include<bits/stdc++.h>
    #define N 45000
    #define mes(x) memset(x, 0, sizeof(x));
    #define ll __int64
    const long long mod = 1e9+7;
    const int MAX = 0x7ffffff;
    using namespace std;
    int mp[55][55], out[60], fa[60];
    void dfs(int u){
        for(int i=1;i<=50;i++)
            if(mp[u][i]){
                mp[u][i]--;mp[i][u]--;
                dfs(i);
                printf("%d %d
    ", i, u);
            }
    }
    void init(int n){for(int i=1;i<=n;i++) fa[i] = i;}
    int find(int n){return fa[n] == n?n:fa[n] = find(fa[n]);}
    void add(int u,int v){fa[find(u)] = find(v);}
    int main(){
        int i, n, a, b, temp, t, T;
        scanf("%d", &T);
        for(temp=1;temp<=T;temp++){
        memset(mp, 0,sizeof(mp));
        memset(out, 0, sizeof(out));
        init(50);
        scanf("%d", &n);
        while(n--){
            scanf("%d%d", &a, &b);
            add(a, b);
            mp[a][b]++;mp[b][a]++;
            out[a]++;out[b]++;
        }
        printf("Case #%d
    ", temp);
        for(t=0,i=1;i<=50;i++)if(out[i]&&fa[i] == i) t++; 
        for(i=1;i<=50;i++) if(out[i]%2) break;
        if(t!=1||i<=50) printf("some beads may be lost
    
    ");
        else{
        dfs(a);printf("
    ");
        }
        }
        return 0;
    }
  • 相关阅读:
    类数组及其转换
    数组去重
    ios UIView
    ios 解决Wkwebview闪烁问题
    ios Https问题
    UUID
    JavaScript4
    JavaScript2
    JavaScript1
    UIScollView
  • 原文地址:https://www.cnblogs.com/Noevon/p/6293585.html
Copyright © 2020-2023  润新知