欧拉回路与欧拉路径总结

  笔者在图论挣扎了这么久,今天总算暂时到头了,鉴于欧拉路径和欧拉回路的精妙(e xin)程度,在这里做一个小小的总结。

 

  首先欧拉绝对是个伟(huai)人,创造了不少东西,其中就包括欧拉路径和欧拉回路这种随便虐死蒟蒻萌新的***

定义

  欧拉回路:从图上一个点u出发不重复地经过每一条边后,再次回到点u的一条路径。

  欧拉路径:从图上一个点u出发不重复地经过每一条边的一条路径(不必回到点u)。

  欧拉图即存在欧拉回路的图,半欧拉图即存在欧拉路径的图。

  (就像是一笔画,要求每条边只走一次,但每个点可以多次经过,而要求每个点只走一次的模型是哈密顿环。注意欧拉回路必须回到起点,欧拉路径则不必,可以说欧拉回路一定是欧拉路径,反之不成立。)

 

定理

  (1)无向图欧拉回路的判定:图G为连通图,所有顶点的度为偶数。

  (2)无向图欧拉路径的判定:图G为连通图,除有2个顶点度为奇数外,其他顶点度都为偶数。

  (3)有向图欧拉回路的判定:图G的①基图联通,所有顶点的入度等于出度。

  (4)有向图欧拉路径的判定:图G的基图联通,存在顶点u的入度比出度小1,v入度比出度大一,其余所有顶点的入度等于出度。(此时u即路径的起点,v即终点)

    ① 忽略有向图所有边的方向,得到的无向图称为该有向图的基图

   “联通”标了红字,当然很重要!有时(实际上是很多时候)给出的原图并不是一个连通图,需小心处理,后面注意事项会提。

 

其他定理(非正式定理,但做题时很有用)

  (5)无向图为(半)欧拉图时,只需用1笔画成;无向图为非(半)欧拉图时,即奇点(度为奇数的点)数k>2,需用k/2笔画成。

  (6)可以用加边的方式把一个非欧拉图变成欧拉图。对于无向图来说,每个奇点都需加一个度,加的边为 奇点数/2 ;对于有向图来说,每个点都需加上入度与出度之差,加的边数为每个点入度与出度之差的绝对值之和再除以2。

  笔者在学习(5)(6)定理的时候,曾有过一个疑问:如果要除以2的数是个奇数该怎么办,该向上还是向下取整呢?我承认这是个智障的问题。首先介绍一个定理:一个图的奇点数一定是偶数。证明很简单,可以看看这里:(https://blog.csdn.net/c_lyr/article/details/53082753

  那么对于(5),和(6)的前半条,肯定不会出现奇数除以2;对于(6)的后半条,我们考虑当入度与出度之差是偶数时,不用担心,而当入度与出度之差是奇数时,则入度与出度之和一定是奇数,即这个点是一个奇点,而奇点有偶数个,偶数个奇数相加,结果也是偶数,因此绝不会出现和是奇数的情况。

 

求欧拉回路欧拉路径

  用DFS遍历整张图,走过的边标记(如果是无向图,注意同时标记相反方向的边),在DFS返回后把点(也可以是边,看题目要求怎样输出)入栈,最后依次出栈即为路径序列。代码很简单,去网上搜吧,就不贴了(笔者懒)。。。

 

注意事项

  求欧拉回路与欧拉路径其实并不是很难的,套模板就行了。难的是那种给一张图统计操作数的题,根据笔者的经验,这种题多半是跟点的入度和出度有关的。当你一脸懵逼不知所措时,不妨从入度和出度入手,灵活运用各种定理分类讨论,往往能找到问题的突破口。还有就是前面提到的,当原图有多个连通块时,需先辨认出每个连通块(并查集或DFS,个人比较喜欢并查集),再分别处理。对于只有一个而没有边的块,一般不用考虑,跳过就行了。

 附上一道还不错的题 https://loj.ac/problem/10111

 

 至此,我已经介绍了关于欧拉回路和欧拉路径的不少知识(坑点),更多的经验还需在刷题中获得,祝大家AC愉快。

 

2018-08-22

posted @ 2018-08-22 17:10  青君  阅读(4189)  评论(2编辑  收藏  举报