欧拉回路

欧拉回路,是一个图问题,也就是说假设我们拿着一只笔,在纸上画一个图,在这个期间笔不能离开纸,同时每一个边只能画一次。也就是人们常说的一笔完成。如下面例子所示:

EulerCircuits

图a,图b可以一笔画出来,而图c不可以。欧拉回路就是研究这个问题:什么样的图能够一笔画成。

我先先来分析上面的图a,可以发现对于图a,虽然可以一笔画成,但是却无法在结束时回到最初的起始点,也就是说假设我们从左下角的点开始画,那么完成这个图形时,笔尖一定是在右下角的点上。

而对于图b,我们发现结束后,笔尖一定会回到最初的起点。

这是一个很有趣的现象,下面我们通过引入一个度的概念来解决这个问题。

度:在无向图中,表示点的边的个数。例如图a中左下角的点的度为3,图b中左下角的点的度为4.

下面我们引入Euler Circuits定理:

  • 如果一个图是连通图(connected),并且每一个点的度都为偶数,那么这个图一定可以一笔画成,同时最终点就是起始点。

  • 如果一个图是连通图(connected),但是有且只有两个点的度为奇数,那么图一定可以一笔画成,但是最终点不是起始点。

  • 如果一个图是连通图(connected),但是一个点的度为奇数或者超过两个点的度为奇数,那么图一定不可以一笔画成。

对于每个点来说,可以进入,可以出去,但是当一个点的度为奇数时,它就只能进入而不能出去了,因此对于C中的情况,是无法一笔画成一个图的;而对于b中的情况,因为只有两个度为奇数的点,因此必有一个点为起始点,一个点为终点,也就是说一个点出去,一个点进去,然后结束不在出来。

下面来看一个比较复杂的例子,怎样找到它的欧拉回路的访问方式。

EulerCircuits1

这个图毫无疑问是有欧拉回路的,因为每个点的度均为偶数。

首先我们随意找到一个点,然后深度遍历,假设为5,4,3,2,8,9,10,5, 那么得到下面的图

EulerCircuits2

然后我们再随意找到一个点,然后深度遍历,假设为4,1,3,6,9,12,10,11,4, 那么得到下面的图

EulerCircuits3

然后我们再随意找到一个点,然后深度遍历,假设为3,9,7,3;

然后我们再随意找到一个点,然后深度遍历,假设为4,7,10,4;
那么得到下面的图,遍历完成

EulerCircuits5

下面我们要将上面的路径合并成一条路径:

5,4,3,2,8,9,10,5
4,1,3,6,9,12,10,11,4
3,9,7,3
4,7,10,4;
合并前两个,得到5,4,1,3,6,9,12,10,11,4,3,2,8,9,10,5

在合并第三个,得到5,4,1,3,9,7,3,6,9,12,10,11,4,3,2,8,9,10,5

合并第四个得到5,4,7,10,4,1,3,9,7,3,6,9,12,10,11,4,3,2,8,9,10,5

显示 Gitment 评论