欧拉回路的判断
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 }
以上是关于欧拉回路的判断的主要内容,如果未能解决你的问题,请参考以下文章