题意:欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
分析:
欧拉路径:一条路,走完所有边,边不重复。
欧拉回路:起点就是终点的欧拉路径。
具有欧拉回路的图称为欧拉图(简称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;
}