欧拉回路
先扯一点题外话。最近几天应该是要做毕设的,可是作为一名资深的拖延症患者,我是没去做毕设。当然喽,资深拖延症患者一般不会无所事事,我拖延了毕设,借口是去看《算法引论》。还真别说,这本书挺好的,给我提供了许许多多可以写博客的素材,今天这篇只是其中之一啦。
欧拉回路其实我之前在不同的场合都看过,自己也做过总结(当然喽,没放在博客里面),但是我始终对那些方法不满意,因为我并没有很清晰的理解。《算法引论》里面给出的证明满足了我,所以我觉得对于欧拉回路我可以写一篇博客了。
本文会先从一个形象直观的角度去阐述,然后会给出两种正式的证明(其实思路差不多,只是表述起来很不一样)。
欧拉图产生于著名的葛底斯堡桥问题。
我们先说一下什么是欧拉回路以及欧拉图。
可以”一笔画“画出来的图(要求回到起点)就是欧拉图,画的路径就是欧拉回路。这样大概清楚了吧,或者这样说:一个蚂蚁可以从图中一点出发沿着边爬行,对于任意一条边蚂蚁只能且必须经过一次,最终蚂蚁回到了起点。而蚂蚁经过的路径就是欧拉回路啦!很形象吧。
那么,我们怎么判断一个图是否是欧拉图,或者说图中欧拉回路存在的条件是什么?
先给出结论:“当且仅当该图中每个点的度数都是偶数”。下面给出三种证明方法:
一、形象版欧拉回路
首先说明欧拉图每个点度数都为偶数。这么来理解啊,小蚂蚁沿着欧拉回路走,每次走过一个点的时候都是需要从该点的一条边进去再从另外一条边出来,故而对每个点而言,边 都是'成对出现的(蚂蚁出发的第一条边和最后一条边也可以看做是成对出现)。由此可见,每个点的度数均为偶数!
反过来,图中每个点度数均为偶数的图中存在欧拉回路。这个证明有点复杂了,我们可能需要用很多只蚂蚁。
- 首先,最简单的点度数为偶数的图就是有两个点两条边的图,该图显然存在欧拉回路。
- 当图中边的数目大于2的时候,我们先随机放一只蚂蚁到任意一点,让它自由的奔跑。我们先给出一个结论,这个蚂蚁最终一定会回到起点。为什么呢? 因为点的度数为偶数,所以每次只要蚂蚁可以进去一个点,则必然有边可以出来这个点。由此,蚂蚁必然最终可以回到开始的起点。
- 此时,整个图可以分为蚂蚁走过的路径已经未走过的路径(可能包含几个不连通的子图),这几个子图都满足点度数为偶数这个条件。
- 如此递归
看的迷迷糊糊的吧,但是大概的思想是不是也知道了。就是用归纳法!下面给出严谨的证明。
二、严谨版欧拉回路
我们只去证明 图中点度数为偶数的图具有欧拉回路。
我们是尝试去用归纳法去证明,那么需要给出正确的归纳参数。归纳的核心在于能够简约问题而又不改动问题,那么显然的,我们不能按照边或者点进行归纳,因为删除一个点或者边之后所剩下的图可能不满足所有点度数为偶数这个条件。
所以我们应该去归纳边集,使得我们删除这个边集之后剩下的图仍然满足所有点读数为偶数这个条件。于是我们选中回路作为这个边集,从起点出发又回到起点的回路。我们断定图中必然存在这个回路,因为当便利到一个节点后,该点的”可用度数(我们不可能原路退出这个点)“就变成了奇数,那么总有可能离开这个点。于是乎我们就会回到起点了。
好了。至此,我们的归纳假设就有了:
归纳假设:对于边数小于m的连通图中,其所有点的度数为偶数,欧拉回路且我们知道怎么去寻找。
三、英文版欧拉回路