图论 - 欧拉回路
定义
欧拉回路是指一条遍历图 中每条边恰好一次的回路。
当 为有向图和无向图时,判定定理不尽相同。
- 当 为有向图时, 存在欧拉回路的充要条件是 是强连通的且 ;
- 当 为无向图时, 存在欧拉回路的充要条件是 是连通的且 。
这两个条件的必要性都是显然的,下文我们只对充分性进行证明,证明方法是证明 Hierholzer 算法能构造出一个合法的欧拉回路。
Hierholzer 算法
如果 是强连通有向图,且每一个点的入度等于出度,我们可以直接使用 Hierholzer 算法构造出一条欧拉回路,伪代码如下:
1 | stk = [] |
-
递归的终点必定是某个递归的起点。
由于这个图入度等于出度,所以 DFS 找出的每一条路径的中间节点必然是入度和出度同时减一。如果终点不是起点,那么必然能够继续走下去。
-
这个压栈的方式可以构造出一个合法的欧拉回路。
如果只有一个环,那么这个算法后序压栈并且逆序输出自然是正确的。
如果有多个环,假设最开始的环起点是 终点是 ,那么栈中的元素应当形如 ,其中 表示 调用 DFS 后入栈的元素按照入栈顺序排列得到的序列。
当我们最终逆序输出时, 后面是 ,然后才是 。我们可以认为它走了一个环路之后又从 继续走,这是一个合法的欧拉回路。
因为这一定是有限个环,所以最终合并出来的也一定是一个合法的欧拉回路。
-
必定遍历了所有的边。
假设 DFS 结束了,已访问的边集是 ,未访问的边集是 ,我们用反证法证明 。
因为 是算法显然能够保证的,我们假设 ,则两个集合都是 的非空真子集。
设 是 的边的端点集合, 同理,任取 。
由于 是强连通的,那么 之间存在路径 ,设 是路径 上第一个在 中的节点,也就是说,存在 使得 。
既然 ,那么 就被 DFS 遍历过了,那么 也被 DFS 遍历过了,于是 的出边都在 中。
但是,DFS 执行完后, 在 中的入度仍然等于出度,又因为 的出边不在 中,所以 的入边也不在 中,这就与 产生了矛盾。
如果 是连通无向图,我们只需要删除的时候把反向边也删掉即可,证明方法基本一样。