欧拉回路 HDU - 1878

发布时间 2023-03-23 16:18:08作者: HelloHeBin

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

分析:
欧拉路径:一条路,走完所有边,边不重复。
欧拉回路:起点就是终点的欧拉路径。
具有欧拉回路的图称为欧拉图(简称E图)。
具有欧拉路径但不具有欧拉回路的图称为半欧拉图。

无向图连通图:

  • 欧拉路径存在的充要条件:度数为奇数的点只有0或2个。
  • 欧拉回路存在的充要条件:度数为奇数的点只有0个。

有向图连通图:

  • 欧拉路径存在的充要条件:所有点的入度等于出度;或者除开起点和终点外,所有点的入度等于出度,且起点出度比入度多1,终点入度比出度多1。
  • 欧拉回路存在的充要条件:所有点的入度等于出度。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1010, INF = 0x3f3f3f3f;
int n, m, a, b;
vector<int> G[N];
bool st[N];
int euler() {
    for (int i = 1; i <= n; i++)
        if ((int)G[i].size() & 1) return 0;
    memset(st, 0, sizeof(st));
    queue<int> q;
    q.push(1), st[1] = 1, m = 1;
    while (q.size()) {
        int u = q.front(); q.pop();
        for (int v : G[u]) {
            if (!st[v]) q.push(v), st[v] = 1, m++;
        }
    }
    return m == n;
}
int main() {
    while (~scanf("%d%d", &n, &m) && n) {
        for (int i = 0; i <= n; i++) G[i].clear();
        for (int i = 1; i <= m; i++) {
            scanf("%d%d", &a, &b);
            G[a].push_back(b), G[b].push_back(a);
        }
        printf("%d\n", euler());
    }
    return 0;
}