题意:中文题
无向图欧拉回路的判定,可用并查集判是否连通图,度为偶数
通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过图中所有边一次且仅一次行遍所有顶点的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。
1 定义
欧拉通路(Euler tour)——通过图中每条边一次且仅一次,并且过每一顶点的通路。
欧拉回路 (Eulercircuit)——通过图中每条边一次且仅一次,并且过每一顶点的回路。
2 无向图是否具有欧拉通路或回路的判定
G有欧拉通路的充分必要条件为:G 连通,G中只有两个奇度顶点(它们分别是欧拉通路的两个端点)。
G有欧拉回路(G为欧拉图):G连通,G中均为偶度顶点。
3 有向图是否具有欧拉通路或回路的判定
D有欧拉通路:D连通,除两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1。
D有欧拉回路(D为欧拉图):D连通,D中所有顶点的入度等于出度。
(注意:这里说有向图连通,说的是有向图是弱连通图。即把有向图中的边变成无向边,只要该图连通,那么原有向图即是弱连通图。实际中可用并查集判断是否弱连通)
资料源自:https://blog.youkuaiyun.com/u013480600/article/details/44805491
链接:hdu 1878
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
using namespace std;
const int maxn = 10005;
const int maxm = 1000050;
const int inf = 0x7f7f7f7f;
int n, m;
int fa[maxn];
int degree[maxn];
int findset(int x) {
if(fa[x] == -1) {
return x;
}
return fa[x] = findset(fa[x]);
}
int main()
{
while(scanf("%d", &n) && n) {
scanf("%d", &m);
memset(degree, 0, sizeof(degree));
memset(fa, -1, sizeof(fa));
for(int i = 1; i <= m; i++) {
int a, b;
scanf("%d %d", &a, &b);
degree[a]++;
degree[b]++;
a = findset(a);
b = findset(b);
if(a != b) {
fa[a] = b;
}
}
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(findset(i) == i) cnt++;
}
if(cnt > 1) {
puts("0");
continue;
}
cnt = 0;
for(int i = 1; i <= n; i++) {
if(degree[i] % 2) cnt++;
}
if(cnt != 0) puts("0");
else puts("1");
}
return 0;
}