欧拉回路/路径判断方法:
欧拉回路:存在一条路径,起点和终点相同,且经过所有的边一次。
欧拉路径:存在一条路径,经过所有的边一次。
首先图必须是联通的,用并查集判即可
无向图欧拉回路:所有点度数都为偶数
无向图欧拉路径:图中只有两个点(或0个点)度数为奇数
有向图欧拉回路:所有点入度=出度
有向图欧拉路径:一个点入度=出度+1,一个点出度=入度+1(两个端点),其余点(或所有点)入度=出度
无向图
判断是否存在欧拉路径/回路:
利用并查集判断是否联通,利用degree数组统计结点数。
#include <iostream>
using namespace std;
int f[1111], degree[1111];
void init(int n) {
for (int i = 1; i <= n; i++)
f[i] = i;
}
int getf(int x) {
if (x == f[x])
return x;
return f[x] = getf(f[x]);
}
void merge(int a, int b) {
a = getf(a);
b = getf(b);
if (a != b)
f[b] = a;
}
int main() {
int n, m, a, b;
cin >> n >> m;
while (m--) {
cin >> a >> b;
merge(a, b);
degree[a]++;
degree[b]++;
}
// 1:欧拉回路,2:欧拉路径
int root = f[1], flag1 = 1, flag2 = 0, cnt = 0;
for (int i = 1; i <= n; i++) {
if (degree[i] & 1)
cnt++;
if (f[i] != root || degree[i] & 1) {
flag1 = 0;
break;
}
}
if (cnt == 2 || cnt == 0)
flag2 = 1;
cout << flag1 << endl<<flag2;
return 0;
}