欧拉路径和欧拉回路通常被用来刻画一类一笔画问题
定义
如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。
如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。
具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。
接下来我们将根据图中边的方向对图进行分类,并讨论存在欧拉回路的条件
以下论述保证图均为连通图
无向图
欧拉路径充分必要条件:所有点度数均为偶数或恰好有两个点度数为奇数
欧拉回路充分必要条件:所有点的度数为偶数
有向图
欧拉路径充分必要条件:所有点的入度等于该点的出度或恰好一点入度比出度大一,一点出度比入度大一且其它点入度与出度相同
欧拉回路充分必要条件:所有点的入度等于该点的出度
以上两点比较容易证明,在此不做过多论述
混合图
在这里只讨论欧拉回路
如果这个图里面既有无向边又有有向边,那么被称作混合图
我们考虑一个最暴力的做法:对每一条无向边枚举一个方向,然后再用有向图的判定方法即可。但这是一个指数阶级的算法,考虑优化
我们给每条边随机一个方向,接下来考虑修改这个图使得它合法,首先考虑如何修改都不会合法的情况:有一个点它的入度和出度之差永远不可能为\(0\),注意到我们将一条无向边反向的话,它对差值的贡献为\(2\)或\(-2\),也就是不会改变这个插值的奇偶性,于是在随机完方向后我们可以直接进行奇偶性的判定
但是这明显是远远不够的,于是我们考虑更进一步的做法
把这个图放到网络流上跑一跑,源点向所有差值\(>0\)的点连边,流量为这个插值,其它的向汇点连边,流量为差值的相反数。同时保留原图中方向是随机得到的边,流量为1,跑一遍网络流
考虑每一条增广路的意义:原图中在增广路上的边需要翻转方向,那么将这样一条路径翻转之后只会有起始点和结束点的度数会发生变化,起始点的差值\(-1\),结束点的差值\(+1\),而这正好对应了从\(s\)流出的流量和向\(t\)流入的流量,于是判定从\(s\)流出的流量是否满流即可,输出方案也十分好写,这里就不放代码了,以后遇到题目再放