UVA10054 The Necklace(欧拉回路)

题目链接

题意:

每个珠子两半有两种不同的颜色组成,相邻两珠子在接触的地方颜色相同,确认一些零碎的珠子,能否还原成完整的项链。

分析:

把每种颜色看成一个结点,珠子的两半连一条有向边,则题目转化为了欧拉回路问题。

注意:

注意编号问题,因为颜色1~50,所以最多有50个结点。

 对欧拉回路输出有疑问的可参考本随笔

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 50+20;
const int n = 50;

int deg[maxn], G[maxn][maxn], m;

void euler(int u){
    for(int v=1; v<=n; v++){    //这里是n而非m
        if(G[u][v]){
            G[u][v]--;
            G[v][u]--;
            euler(v);
            printf("%d %d\n", v, u);
        }
    }
}

int main(){
    int T, u, v, kase=0;
    cin >> T;
    while(T--){
        cin >> m;

        memset(deg, 0, sizeof(deg));
        memset(G, 0, sizeof(G));

        for(int i=0; i<m; i++){
            cin >> u >> v;
            G[u][v]++;
            G[v][u]++;
            deg[u]++;
            deg[v]++;
        }

        bool flag = true;

        for(int i=1; i<=n; i++){    //这里也是n非m
             if(deg[i] % 2 == 1) { flag = false; break; }
        }

        if(kase) putchar('\n');

        if(flag){
            printf("Case #%d\n", ++kase);
            euler(u);
        }
        else printf("Case #%d\nsome beads may be lost\n", ++kase);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/tanhehe/p/3097590.html