欧拉图 学习笔记
在图论中,欧拉路径(Eulerian path)是经过图中每条边恰好一次的路径,欧拉回路(Eulerian circuit)是经过图中每条边恰好一次的回路。 如果一个图中存在欧拉回路,则这个图被称为欧拉图(Eulerian graph);如果一个图中不存在欧拉回路但是存在欧拉路径,则这个图被称为半欧拉图(semi-Eulerian graph)。
CAUTION
此处定义中虽然使用「路径」一词,但严格说来此处使用的概念应该是「迹(trail
性质
以下我们假设所讨论的图
对于连通图
是欧拉图; 中所有顶点的度数都是偶数(对于有向图,每个顶点的入度等于出度 ) ; 可被分解为若干条不共边回路的并。
以下我们对等价性进行证明。
若一个图
若一个图
若一个连通图
以上的性质同时也构成了欧拉图的判断条件。具体地说,一个图是欧拉图当且仅当非零度顶点互相(强)连通,且顶点的度数都是偶数(或入度与出度相等
欧拉回路 / 欧拉路径的构造
此处我们介绍最常用的 Hierholzer 算法,该算法的核心思想为利用上述欧拉图性质中的第三点,即欧拉图可以被拆解为若干条不共边回路的并。 可以注意到,在上述证明中其实已经提到了完整可行的将不共边回路合并为欧拉回路的操作,且在使用合适的数据结构储存时(如使用类链表的结构储存环)实现并不困难。
算法的具体流程为先从图中找到一条回路作为当前回路,每次从当前回路中选取剩余度数不为零的点,从该点出发找到一条新的简单回路,并将该简单回路与当前回路合并,重复该过程直到当前回路中的所有点均无剩余度数,此时的当前回路即为欧拉回路。
该算法同样适用于有向图。对于半欧拉图,可以从图中找到一条连接两个奇度数点的路径作为当前路径,每次选取度数非零的点寻找简单回路并将其与当前路径合并,最后得到欧拉路径。
实现
Hierholzer 算法的伪代码如下:
时间复杂度分析
Hierholzer 算法的时间复杂度为
注意到在前述正确性分析中,在欧拉图或半欧拉图上寻找简单回路(或半欧拉图的初始路径)的过程是 无需回溯 的,只要沿着剩下的边一直走就必定可以发现所求的回路或路径,且 每条边仅会被访问一次。 为了利用这一性质,在实现上应采取类链表的方式储存图中的边,如邻接表或链式前向星,以便每条边在被访问过后即刻删除之。如果采用朴素的邻接矩阵进行储存,则每次寻边耗时
如果需要输出字典序最小的欧拉路或欧拉回路,则需要将边排序,时间复杂度为
应用
有向欧拉图可用于计算机译码。
设有
构造如下有向欧拉图:
设
规定
顶点
边
这样的
任求