欧拉回路与欧拉路径总结
笔者在图论挣扎了这么久,今天总算暂时到头了,鉴于欧拉路径和欧拉回路的精妙(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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!