欧拉回路的判断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉回路的判断相关的知识,希望对你有一定的参考价值。

参考技术A

以下判断基于此图的基图连通。
无向图存在欧拉回路的充要条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
有向图存在欧拉回路的充要条件
一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。
混合图存在欧拉回路条件
要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:
假设有一张图有向图G',在不论方向的情况下它与G同构。并且G'包含了G的所有有向边。那么如果存在一个图G'使得G'存在欧拉回路,那么G就存在欧拉回路。
其思路就将混合图转换成有向图判断。实现的时候,我们使用网络流的模型。现任意构造一个G'。用Ii表示第i个点的入度,Oi表示第i个点的出度。如果存在一个点k,|Ok-Ik|mod 2=1,那么G不存在欧拉回路。接下来则对于所有Ii>Oi的点从源点连到i一条容量为(Ii-Oi)/2的边,对于所有Ii<Oi的点从i连到汇点一条容量为(Oi-Ii)/2的边。如果对于节点U和V,无向边(U,V)∈E,那么U和V之间互相建立容量为无限大的边。如果此网络的最大流等于∑|Ii-Oi|/2,那么就存在欧拉回路。

hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)

 题目链接

 

 1 /*
 2 
 3     模板题-------判断欧拉回路 
 4      
 5     欧拉路径,无向图
 6     1判断是否为连通图, 
 7     2判断奇点的个数为0
 8 */
 9 #include <iostream> 
10 #include <cstring>
11 #include <vector>
12 #include <cstdio>
13 using namespace std;
14 struct DisjoinSet {//并查集判断是否连通
15     vector<int> father, rank;
16     
17     DisjoinSet(int n): father(n), rank(n) {
18         for (int i=0; i<n; i++) {
19             father[i] = i;
20         }
21     }
22     
23     int easy_find(int v)  {//非递归 
24         int k, j, r;
25         r = v;
26         while (r!=father[r]) {
27             r = father[r];
28         }
29         k = v;
30         while (k!=r) {
31             j = father[k];
32             father[k] = r;
33             k = j;
34         }
35         return r;
36     }
37     void merge(int x, int y) {
38         int a = easy_find(x), b = easy_find(y);
39         if (rank[a] < rank[b]) {
40             father[a] = b;
41         } else {
42             father[b] = a;
43             if (rank[b] == rank[a]) {
44                 ++rank[a];
45             }
46         }
47     }
48 } ; 
49 
50 const int MAXN = 1010;
51 int edge[MAXN];
52 int p, q;
53 int main()
54 {
55 //    freopen("in.txt", "r", stdin);
56     while (~scanf("%d %d", &p, &q) && p) {
57         memset(edge, 0, sizeof(edge));
58         DisjoinSet mfs(1010);
59         for (int i=0; i<q; i++) {
60             int a, b;
61             scanf("%d %d", &a, &b);
62             edge[a]++;
63             edge[b]++;
64             mfs.merge(a, b);
65         }
66         int father = mfs.easy_find(1);
67         int ct = 0;
68         for (int i=1; i<=p; i++) {
69             if (mfs.father[i] != father) {
70                 ct = -1;
71                 break;
72             }
73             if (edge[i] & 1) ct++;
74         }
75         if (ct == 0) printf("1\n");//欧拉回路
76         else printf("0\n");
77     }
78     return 0;
79 }

 

以上是关于欧拉回路的判断的主要内容,如果未能解决你的问题,请参考以下文章

hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)

欧拉回路

太鼓达人:欧拉回路(暴搜)

计蒜客 | 欧拉回图 | 判断欧拉回路

欧拉回路的解法

欧拉回路混合图的欧拉回路