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