The Necklace

OJ: luogu

题目 ID: UVA10054

标签: 欧拉回路

日期: 2025-12-18 13:21

目录

cpp
/**
 * Author by Rainboy blog: https://blog.roj.ac.cn github : https://github.com/rainboylvx
 * date: 2025-12-18 13:22:33
 */
#include <bits/stdc++.h>
using namespace std;
typedef  long long ll;
typedef  unsigned long long ull;

const int maxn = 55;
int n,m;

int g[maxn][maxn]; // 邻接矩阵
int deg[maxn]; // 每个点的度
int color;

void init(){
    memset(g,0,sizeof(g));
    memset(deg,0,sizeof(deg));
    std::cin >> n;
    for(int i = 1;i <= n ;++i ) // i: 1->n
    {
        int u,v;
        std::cin >> u >> v;
        deg[u]++;
        deg[v]++;
        g[u][v]++;
        g[v][u]++;

        // 记录一个出现过的颜色
        // 起点只能是出现过的颜色
        color = u;
    }
}

void euler(int u) {

    // v 是u相邻的点
    for(int v = 1;v <= 50 ;++v ) // v: 1->50
    {
        if( g[u][v] ) {

            //删除这条边
            g[u][v]--;
            g[v][u]--;
            euler(v);

            //回溯的时候输出
            std::cout << v  << " " << u << "\n";
        }
    }
}

bool check_deg() {
    // 是否存在度为奇数点
    for(int i = 1;i <= 50 ;++i ) // i: 1->50
    {
        if( deg[i] % 2 == 1) 
        {
            return 0;
        }
    }
    return 1;
}

signed main () {
    ios::sync_with_stdio(false); cin.tie(0);
    int T;
    std::cin >> T;
    int cnt = 0;
    while (T--) {
        cnt++;
        //在相邻两组输出之间应有一个空行
        if( cnt != 1 ) cout << "\n";
        std::cout << "Case #" << cnt << "\n";
        init();
        if( check_deg() ) {
            euler(color);
        }
        else {
            std::cout << "some beads may be lost" << "\n";
        }
        
    }
    
    return 0;
}