UVA10054 The Necklace --- 欧拉回路

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lmhlmh_/article/details/101831092

书上的题解是将每个珠子的两半看成节点,建模成一个无向图判断欧拉回路。

判断欧拉回路要求是联通图,每个节点度数为偶数即可,题目意思是联通图,所以判断度数即可,然后DFS逆序输出欧拉路径

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MAXN 60
using namespace std;
int mp[MAXN][MAXN];
int d[MAXN];
int n;

void euler(int u) {
    int v;
    for( v = 1;v <= 50;v++) {
        if(mp[u][v]) {
            mp[u][v]--;
            mp[v][u]--;
            euler(v);
            printf("%d %d\n",v,u);
        }
    }
}

int main() {
    int T;
    int kase = 1;
    scanf("%d",&T);
    while(T--) {
        if(kase>1) printf("\n");
        int temp;
        memset(mp,0,sizeof(mp));
        memset(d,0,sizeof(d));
        scanf("%d",&n);
        int a,b;
        for(int i = 0;i < n;i++) {
            scanf("%d%d",&a,&b);
            mp[a][b]++;
            mp[b][a]++;
            d[a]++;
            d[b]++;
            temp = a;
        }
        bool flag = true;
        for(int i = 1;i <= 50;i++) {
            if(d[i]%2!=0) flag = false;
        }
        printf("Case #%d\n",kase++);
        if(flag == false) {
            printf("some beads may be lost\n");
        } else {
            euler(temp);
        }
        
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/lmhlmh_/article/details/101831092