欧拉回路

欧拉回路与欧拉路径

元气小坏坏 提交于 2019-12-27 04:32:33
原文地址:https://blog.csdn.net/qq_34454069/article/details/77779300 定义: 欧拉回路:每条边恰好只走一次,并能回到出发点的路径 欧拉路径:经过每一条边一次,但是不要求回到起始点 无向图 首先,在无向图中,要确定是否存在欧拉回路很容易:只要每个点的度数均为偶数即可。(这里就不扯什么连不连通的鬼东西了)。 因为每个点的度数为偶数,所以可以将整个图看做由数个环嵌套而成,因为环一定能找到一条欧拉回路,所以整个图也能找到欧拉回路。 欧拉路径:如果有且仅有两个点的度数为奇数,就会存在一条从这两个中的一个到达另一个的欧拉路径。 假如在这两个点间连一条边,就能够从任意一个点出发找到一条欧拉回路,当出发点为这两个点中的一个时,切断这条边,就成为一条欧拉路径了。 有向图 欧拉回路:所有点的入度等于出度,就存在一条欧拉回路。 这里可以换一种角度来理解,对于每一个点,每次进入这个节点,就一定有一条路可以出去,因此必定存在一条欧拉回路。 欧拉路径:最多有一点入度等于出度+1,最多有一点入度等于出度-1,就会有一条从出度大于入度(没有则等于)的点出发,到达出度小于入度(没有则等于)的点的一条欧拉路径。证明方法与无向图的欧拉路径类似。 来源: https://www.cnblogs.com/WTSRUVF/p/9359239.html

混合图的欧拉回路

旧巷老猫 提交于 2019-12-26 15:10:10
混合图: 即有的边有向,有的边无向。 定义: 对于图G的一个回路,若它恰通过G中每条边一次,则称该回路为 欧拉(Euler)回路 。 具有欧拉回路的图称为 欧拉图 (简称E图)。 定理 : 一个无向图是欧拉图,当且仅当该图所有顶点度数都是偶数。 一个有向图是欧拉图,当且仅当该图所有顶点度数都是0。 有向图存在欧拉回路的充要条件:基图(把所有有向边变成无向边以后得到的图)连通,且每个点的出度等于入度。 所以求混合图的关键是:判断能否存在一个定向,使得每个节点的入度等于出度。 因此可以用网络流来做。建边方法,黑书上有两种,这里讲第二种,更好一点的。图的点数为n + 2,边数为 m + n,其中,n为原点数,m为原边数。 黑书上的讲的我没看太懂,按照我自己的理解,讲一下建图过程。 在原图中,首先给每条无向边任意定向,构成一个有向图,计算每个点的度deg,入度为正,出度为负,如果某个点的deg为奇数,显然不存在欧拉回路。由于原来的有向边,不能更改方向,无用,删了,对原图中的无向边定向后构成的有向图,如果点 i 到j 有一条弧,弧< i , j >容量加1(i 到 j 有多条边的时候,即有重边,可以一条边,多容量代替) 增加源点S,汇点T,对于每个点 i ,如果deg < 0,即出度大于入度,从S引一条弧到 i ,容量为(- deg ) / 2;如果deg > 0, 即入度大于出度,从 i

hdu 1956 (网络流解决欧拉回路)

冷暖自知 提交于 2019-12-17 13:46:35
题目连接:https://vjudge.net/problem/HDU-1956 题意:给定一些点和一些边,有些边是有向的,,有些边是无向的,求是否存在欧拉回路。 题解:想不到的网络流。 混合图: 即有的边有向,有的边无向。 定义: 对于图G的一个回路,若它恰通过G中每条边一次,则称该回路为 欧拉(Euler)回路 。 具有欧拉回路的图称为 欧拉图 (简称E图)。 定理 : 一个无向图是欧拉图,当且仅当该图所有顶点度数都是偶数。 一个有向图是欧拉图,当且仅当该图所有顶点度数都是0。 有向图存在欧拉回路的充要条件:基图(把所有有向边变成无向边以后得到的图)连通,且每个点的出度等于入度。 所以求混合图的关键是:判断能否存在一个定向,使得每个节点的入度等于出度。 建图过程。 在原图中,首先给每条无向边任意定向,构成一个有向图,计算每个点的度deg,入度为正,出度为负,如果某个点的deg为奇数,显然不存在欧拉回路。由于原来的有向边,不能更改方向,无用,删了,对原图中的无向边定向后构成的有向图,如果点 i 到j 有一条弧,弧< i , j >容量加1(i 到 j 有多条边的时候,即有重边,可以一条边,多容量代替) 增加源点S,汇点T,对于每个点 i ,如果deg < 0,即出度大于入度,从S引一条弧到 i ,容量为(- deg ) / 2;如果deg > 0, 即入度大于出度,从 i

poj 1637 求混合图的欧拉回路

天涯浪子 提交于 2019-12-17 10:53:45
网上摘的一些知识点 基础知识 欧拉回路是图G中的一个回路,经过每条边有且仅一次,称该回路为欧拉回路。具有欧拉回路的图称为欧拉图,简称E图。 无向图中存在欧拉回路的条件:每个点的度数均为偶数。 有向图中存在欧拉回路的条件:每个点的入度=出度。 欧拉路径比欧拉回路要求少一点: 无向图中存在欧拉路径的条件:每个点的度数均为偶数或者有且仅有2个度数为奇数的点。 有向图中存在欧拉路径的条件:除了2个点外,其余的点入度=出度,且在这2个点中,一个点的入度比出度大1,另一个出度比入度大1。 欧拉路径的输出:经典的套圈算法。 下面来重点讲讲 混合图的欧拉回路 问题。 混合图就是边集中有有向边和无向边同时存在。这时候需要用网络流建模求解。 建模: 把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。 因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路。 好了,现在每个点入度和出度之差均为偶数。那么将这个偶数除以2,得x。也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出 = 入。如果每个点都是出 = 入,那么很明显,该图就存在欧拉回路。 现在的问题就变成了:我该改变哪些边,可以让每个点出 = 入?构造网络流模型。 首先,有向边是不能改变方向的,要之无用,删

混合图的欧拉回路判定

巧了我就是萌 提交于 2019-12-17 08:12:06
  对于有向图和无向图的欧拉回路判定,很容易做到.那对于混合图呢??   混合图就是图中既存在无向边又存在有向边的图.   至于解法:  转载自这里   把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路。   好了,现在每个点入度和出度之差均为偶数。那么将这个偶数除以2,得x。也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出 = 入。如果每个点都是出 = 入,那么很明显,该图就存在欧拉回路。    现在的问题就变成了:我该改变哪些边,可以让每个点出 = 入?构造网络流模型。首先,有向边是不能改变方向的,要之无用,删。一开始不是把无向边定向了吗?定的是什么向,就把网络构建成什么样,边长容量上限1。 另新建s和t。对于入 > 出的点u,连接边(u, t)、容量为x,对于出 > 入的点v,连接边(s, v),容量为x(注意对不同的点x不同)。之后,察看是否有满流的分配。有就是能有欧拉回路,没有就是没有。欧拉回路是哪个?察看流值分配,将所有流量非 0(上限是1,流值不是0就是1)的边反向,就能得到每点入度 = 出度的欧拉图。   由于是满流,所以每个入 > 出的点,都有x条边进来,将这些进来的边反向,OK,入 =

欧拉回路模板

依然范特西╮ 提交于 2019-12-05 05:04:33
欧拉回路模板 从无向图中的一个节点出发走出一条道路,每条边恰好经过一次。这样的路线称为欧拉道路。 如果一个无向图是连通的,且最多只有两个奇点,则一定存在欧拉道路。如果有两个奇点,则必须从一个奇点出发,另一个奇点终止;如果奇点存在,则可以从任意点出发,最终一定会回到该点(称为欧拉回路)。 算法模板: int P,Q,con;//con用于记录连通点的个数 int Euler(){ int cont=0;//统计奇度点的个数 queue<int>q; q.push(1); visit[1]=1; while(!q.empty()){ int t=q.front(); q.pop(); con++; int sum=0;//记录这个点的边数 for(int i=1;i<=P;i++){ if(Map[t][i]){ if(!visit[i]){ visit[i]=1; q.push(i); } sum++; } } if(sum%2){ cont++; } } return cont; } 在main函数中 加上 if((cont==0 || cont==2) && P==con) 来源: https://www.cnblogs.com/mak370/p/11908401.html

欧拉路&&欧拉回路

只谈情不闲聊 提交于 2019-12-03 11:56:11
  T1是欧拉路板子,但我不会,直接爆炸。。 这玩意就是个dfs ,但我以前一直以为欧拉路只能$O(nm)$求 今天才知道可以$O(n+m)$ 欧拉路判定: 无向:起点终点为奇度点,其余偶度 有向:起点终点出度入度分别差一,其余相等。 欧拉回路类似。 怎么求?? 我们可以很容易找到起点。然后由于其他点的度数为偶数,就可以保证进去就一定可以出来。 所以瞎搜就完事 ,注意到有环套环的情况,我们先把这个点扩展完再把该点入栈。 代码实现很简单: void dfs(int x) {   for(int i=head[x];i;i=nxt[i])    if(!v[id[i]])    {       v[id[i]]=1;      dfs1(to[i]);      s[++top]=id[i];     }  return ; } 一点优化: 当前弧优化,注意到有些毒瘤出题人卡这种做法。 因为一个点不止拓展一次,那么复杂度就没有保证了,最简单的数据就是两个点直接连着m条边。 所以有大佬发明了这样一个优化: 一条边被访问过就没用了,所以我们可以直接把表头设为第一个合法的,也就是去除无用状态。 代码: void dfs(int x) { int i=head[x]; while(i) { while(i&&v[id[i]]!=0) i=nxt[i]; head[x]=i; if(i) { v

欧拉回路

给你一囗甜甜゛ 提交于 2019-12-03 09:09:56
钟长者(Orz)的课堂总结 一,欧拉回路:能够从一个点出发,不重复的走过每一条边,回到起点的路径称为欧拉回路。 判定条件:对于无向图:1,图是连通图 2,所有点的度数均为偶数 对于有向图:1,图是连通图 2,所有点的入度等于出度 二,欧拉路径:能够从一个点出发,不重复的走过每一条边的路径称为欧拉路径。 判定条件:对于无向图:1,图是连通图 2,有且只有两个点的度为奇数,其余点的度均为偶度。 *对于一个无向图若有2*k个奇度数的点,则为一个k笔画问题。 对于有向图:1,图是连通图 2,有且只有一个点出度减入度等于1,有且仅有一个点 的出度-入度等于1,其余所有点的入度等于出度。 求欧拉路径数量:BEST定理。 题1:给定一张无向图,要求把边分成两部分,使得任意一部分都组成一条路径。 若联通块的数量大于2,则无解; 如果联通块的数量等于二,则当且仅当两个联通块都存在欧拉回路 时有解。若联通块数量为1,若存在一条欧拉回路,则任意切开两个点分为两个集合即可,若存在一条 欧拉路径,同上,若是k(k=2)笔画问题,首先要有四个点的度为奇数,再两个奇数度的点之间连一条 边,判断一下是否存在欧拉回路即可。 *k笔画是否存在问题均转化成欧拉回路问题。 来源: https://www.cnblogs.com/Hoyoak/p/11785113.html

欧拉回路模板

匿名 (未验证) 提交于 2019-12-03 00:29:01
(1)判断 欧拉回路(把所有边走一遍,最后回到起点) 无向图的所有点度数为偶数, 且联通 有向图的所有点入度=出度, 且联通 欧拉道路( 把所有边走一遍 , 不回到起点) 无向图 所有点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。同时要联通(忽略方向) 有向图所有点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1 。 同时要联通(忽略方向) (2)输出路径 int dfs(u) //欧拉回路则从任意点开始, 欧拉道路要从起点开始(出度=入度+1) { REP(i, 0, g[u].size()) { int v = g[u][i]; if(!vis[u][v]) //这条边还没有遍历过 { vis[u][v] = vis[v][u] = 1; //这是无向图, 有向图则改为 vis[u][v] = 1 dfs(v); stack.push(node(u, v)); //注意最后从栈顶输出到栈底 } //这句话一定要在dfs后面 } } 文章来源: 欧拉回路模板

欧拉回路判断规则

匿名 (未验证) 提交于 2019-12-02 23:49:02
无向图:因为欧拉路径中,除了起点与终点以外,任意点的“进”“出”次数相等,所以除了两个点为奇点(度数为奇数的点)(终点和起点)以外,其它点的度数均为偶数。 如果是欧拉回路,奇点的个数应该为0。 有向图:欧拉路径中,最多只有两个点的入度不等于出度。起点出度比入度大1,终点入度比出度大1。 如果是欧拉回路,所有点的 入度=出度 。