HDU - 1878 欧拉回路

Problem Description

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

Input

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。

Output

每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。

Sample Input

3 3
1 2
1 3
2 3
3 2
1 2
2 3
0

Sample Output

1
0

题目分析

思路

本题应该是并查集+欧拉回路问题。大概就是要注意一下几点:

  • 所有顶点的度数所有是偶数
  • 必须保证是一个连通图

AC代码

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

using namespace std;

int degree[1000], m, n;
int num[1200];

void connect(int a, int b) {
    if (num[a] == num[b])
        return;
    int p = num[a];
    int q = num[b];
    for (int i = 1; i < n; i++) {
        if (num[i] == p)
            num[i] = q;
    }
}
int main() {
    while (cin >> n && n) {
        cin >> m;
        //init
        for (int i = 1; i <= n; i++) {
            num[i] = i;
        }
        memset(degree, 0, sizeof(degree));
        for (int i = 0; i < m; i++) {
            int a, b;
            cin >> a >> b;
            degree[a]++;
            degree[b]++;
            connect(a, b);
        }

        int sign = 0;
        for (int i = 1; i<= n; ++i) {
            if (degree[i] % 2) {
                sign = 1;
                break;
            }
        }
        if (sign)
            cout << "0" << endl;
        else {
            int cnt = 0;
            for (int i = 1; i <= n; ++i) {
                if (num[i] == i)
                    cnt++;
            }
            if(cnt == 1)
                cout << "1" << endl;
            else
                cout << "0" << endl;
        }
    }
    return 0;
}
Last modification:July 17th, 2019 at 10:15 am
如果我的文章对你有用,请随意赞赏,不要白嫖哦~