欧拉通路、欧拉回路、欧拉图和半欧拉图以及 Hierholzer 算法

欧拉回路算法 Hierholzer和Fleury算法的基本思路差不多,在DFS时找环。Fleury使用分段策略,找到一条环后,以环中某一个还存在邻接边的节点重新开始使用DFS找环,直到找到所有环。Hierholzer算法很有技巧性,在回溯时检查节点是否还有邻接边,有则重新DFS直到完毕。 阅读详情
AI摘要

本文详细解析了欧拉路径、欧拉回路的概念,探讨了无向图和有向图的欧拉图与半欧拉图特征,包括度数条件和Hierholzer算法的应用。重点讲解了欧拉路径与欧拉回路的区别以及它们在连通图中的角色。

概念:欧拉通路(又称欧拉路径)、欧拉回路、欧拉图和半欧拉图

定义

  • 通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路(又称欧拉路径)。
  • 通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路。
  • 具有欧拉回路的图称为欧拉图(Eulerian graph)。
  • 具有欧拉通路但不具有欧拉回路的图称为半欧拉图(semi-Eulerian graph)。
  • 欧拉回路是欧拉路径,欧拉路径不一定是欧拉回路。

特征

1.在无向图中:
​​  无向图G为欧拉图,当且仅当 G为连通图 且 所有顶点的度为偶数。
​​  无向图G为半欧拉图,当且仅当 G为连通图 且 除了两个顶点的度为奇数之外,其它所有顶点的度为偶数。

2.在有向图中:
​​  有向图G为欧拉图,当且仅当 G为连通图 且 所有顶点的入度等于出度。
​​  有向图G为半欧拉图,当且仅当 G为连通图 且 存在某一顶点的入度比出度大1,还存在另一个顶点的入度比出度小1,而其它所有顶点的入度等于出度。

其中我们可以发现:对于有向图的半欧拉图,它的欧拉路径的起点的度是出度 = 入度+1,终点的度是入度 = 出度+1。

连通图类型欧拉路径的顶点特征欧拉回路的顶点特征
无向图度为奇数的顶点数为 0 或 2度为奇数的顶点数为 0
有向图特征起点的入度 - 出度 = -1,终点的入度 - 出度 = 1, 其余顶点的入度 = 出度每个顶点的入度 = 出度

Hierholzer 算法

​​  Hierholzer 算法证明了一点:当存在欧拉路径或欧拉回路时,从合理的起点一直执行 DFS 遍历,最后得到的路径一定是欧拉路径或欧拉回路。

Hierholzer 算法用于寻找欧拉路径或欧拉回路(该算法假定图有欧拉路径或欧拉回路),其流程如下:

  • 从起点出发,进行深度优先搜索(DFS);
  • 每次沿着某条边从某个顶点移动到另外一个顶点的时候,都将这条边标记为已走过;
  • 如果遇到阻塞(即当前顶点没有后续邻边或该顶点的邻边都走过),则将当前顶点加入到栈中,并回溯到上一顶点查找其可移动到的顶点。

Hierholzer 算法的重要性质——即它是如何找到欧拉路径或欧拉回路:

  1. 使用 Hierholzer 算法后,如果该图为欧拉图,则栈底的必定为起点。如果该图为半欧拉图,则栈底的是与起点不同的另外一个奇度数顶点。——实际上栈底存储的都是终点,只是欧拉回路的终点就是起点。

证明:(下面的度数都是指出度 + 入度,下面的当前顶点是指入栈时的顶点)
​​  当顶点入栈时,说明当前顶点没有相邻边。
​​​​  考虑到从起点出发到当前结点的路径中,除了起点和当前顶点外,其他的顶点都失去了偶数度数。(比如A->B->C->B->D,可以看出,除了起点A和当前顶点D,其它的顶点B和C都是至少一次一进一出,入度和出度失去的个数合起来就是偶数度数,C失去了1个入度和出度,B失去了2个入度和出度)
​​​​  关键的是:如果起点和当前顶点不同,那么两者都失去了奇数度数。如果起点和当前顶点相同,则起点失去了偶数度数。(途经一顶点时,那个顶点会失去偶数度数。停留在某顶点时,会失去奇数度数,而当前顶点此时的度数为0,所以当前顶点的初始度数为奇数度数)
​​  如果图中包含欧拉回路,意味着所有顶点的初始度数都是偶数。而当前顶点的当前度数为0,表示当前顶点的初始度数必定是奇数,这与欧拉图的特征产生矛盾,因此假设不成立。所以对于欧拉图,当前顶点就是起点。
​​​​  同样地,对于欧拉路径,当前顶点不可能是起点,否则起点的初始度数就是偶数。而欧拉路径中起点和终点的度数一定是奇数。因此,当前顶点不是起点,但是它的初始度数也是奇数,所以一定是欧拉路径的终点。

  1. 如果该图为欧拉图或半欧拉图,则栈中的自底到顶的第 NNN 个顶点就是欧拉回路或欧拉路径上的第 NNN 个顶点。

证明:( deg⁡\degdeg 表示度数)​​
  在此只证明栈中相邻顶点在图中也为相邻顶点。因为模拟 Hierholzer 算法过程,可知该算法实际上就是在模拟“一笔画”过程,并且沿着画完的轨迹,从终点开始逆序逐一添加顶点到栈中。
​​  下面主要以 n=2n = 2n=2 的情况为例,后面的情况可以此类推。并且为了不用纠结于区分欧拉回路和欧拉路径,不妨以半欧拉图为例。
​​  假设图中存在相邻的两顶点 V1V2V_1V_2V1​V2​,并且 DFS 的过程中,先访问 V2V_2V2​ 随后访问了 V1V_1V1​,并且 V1V_1V1​ 成为第一个入栈的顶点。由性质一可知, V1V_1V1​ 就是欧拉路径上的终点(入度 - 出度 = 1 的顶点为终点)。
​​  根据 Hierholzer 算法可知,在遍历过程中,因为删除了途径的边,所以此时路径中途经的所有顶点(包括起点和终点 V1V_1V1​ )的度数都为偶数(0或非0偶数)。那么当然 deg⁡(V2)\deg( V_2)deg(V2​) 也是偶数,接下来就分类讨论。

  • 如果 deg⁡(V2)=0\deg( V_2) = 0deg(V2​)=0 ,也就是说当前顶点 V2V_2V2​ 成为第二个入栈的顶点,那么 n=2n = 2n=2 的情况就证毕了。
  • 如果 deg⁡(V2)>0\deg( V_2) > 0deg(V2​)>0 (即不为 0 的偶数),那么考虑当前包含 V2V_2V2​ 的子图 GGG ,显然 GGG 是一个欧拉图,那么当前以 V2V_2V2​ 为起点继续实施 Hierholzer 算法遍历剩下的相邻边,根据性质一, V2V_2V2​ 将会是 GGG 中第一个入栈的顶点。也就是, V2V_2V2​ 是原图中第二个入栈的顶点。

​​  对于第二种情况我们来举例讨论下:
在这里插入图片描述
  假设 JFK 先前往 KUL,即 JFK->KUL,可以看出 deg⁡(JFK)>0\deg(JFK) > 0deg(JFK)>0 且是偶数,此时我们考虑当前包含 JFKJFKJFK 的子图,很明显这是一个欧拉图,那么由其定义我们可以知道,该子图第一个入栈的一定是 JFKJFKJFK。所以 JFKJFKJFK 是原图中紧接着 KULKULKUL 入栈的第二个顶点。
​​  综上所述,以此类推, Vn−1V_{n-1}Vn−1​ 入栈前最后接触过的 VnV_nVn​ 将会是第 nnn 个入栈的顶点,再结合直观理解, VnV_nVn​ 就是路径上的第 nnn 个顶点。

实现求欧拉回路算法(C++) 实现求欧拉回路的算法,主要涉及邻接矩阵、DFS、逐步插入回路法等。 阅读详情

相关推荐

图论11-欧拉回路与欧拉路径+Hierholzer算法实现

【代码】图论11-欧拉回路与欧拉路径+Hierholzer算法实现。

啊枫 1215

欧拉路,欧拉回路

欧拉路,欧拉回路

luyihong666的博客 1443

欧拉通路/回路和一笔画问题

欧拉通路/回路和一笔画问题简介欧拉通路、欧拉回路和欧拉图无向图有向图Hierholzer 算法LeetCode [332. 重新安排行程](https://leetcode-cn.com/problems/reconstruct-itinerary/)LeetCode [753. 破解保险箱](https://leetcode-cn.com/problems/cracking-the-safe/) 简介 LeetCode 每日一题刷到了一笔画问题。其核心是找到图的欧拉通路或欧拉回路。之前用DFS做的,算法也

lih627 1166

欧拉路径和欧拉回路(Euler Path and Euler Circuit)解释

欧拉路径 欧拉回路

Jasonchen1224的博客 5933

迅投miniQMT量化交易之【网格交易】的实现(25)——写在最后

和大家一起分享如何使用miniQMT实现我们自己的网格交易系统。如果您对量化交易感兴趣,欢迎一起交流。

tzzqn2008的专栏 829

【JESD79-5之】8 AC & DC 输入测量标准(AC & DC Input Measurement Levels)

时钟被驱动到DRAM,可以通过L/RDIMM模块的RCD来实现,也可以通过U/SODIMM模块的主机来实现(图184)。接收机DQS(脉冲)输入电压灵敏度测试提供了在没有码间干扰(ISI),抖动(Rj, Dj, DCD)和串扰噪声的情况下测试接收机对不同输入电压的灵敏度的方法。接收机数据输入电压灵敏度测试提供了在没有符号间干扰(ISI),抖动(Rj, Dj, DCD)和串扰噪声的情况下测试接收机对不同输入电压的灵敏度的方法。

m0_61126667的博客 1703

欧拉回路 Hierholzer算法 简单笔记

1.基本概念 欧拉回路: 遍历所有边一次且行遍所有顶点的回路 欧拉通路: 遍历所有边一次且行遍所有顶点的通路 欧拉图: 具有欧拉回路的图 半欧拉图: 具有欧拉通路的图 2.判定条件 欧拉图: 每个点度数都为偶数,相当于很多个环交叉起来。 半欧拉图: 仅有两个点度数为偶数,相当于一条边连着两个欧拉图。 3.判定条件的证明:Hierholzer算法 核心部分长这样 void dfs(int x) { for(int i = head[x];i;i = nex[i]) { int

tomjobs的博客 2602

手把手教你设计反激开关电源:从整流滤波到PCB布局的实战避坑指南

本文是一份反激开关电源的实战设计指南,重点解析了从整流滤波电路到PCB布局的关键细节与常见陷阱。文章深入探讨了输入保护元件协同设计、EMI滤波器优化、整流桥与滤波电容选型,并详细阐述了如何通过优化PCB布局来确保安规、最小化功率回路面积以控制噪声,旨在帮助工程师和爱好者规避设计误区,提升电源的可靠性与性能。

yhn45678901的博客 690

欧拉回路Hierholzer 算法

定义 通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路。 通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路。 具有欧拉回路的无向图称为欧拉图。 具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图。 判定 1.图G是连通的,无孤立点。 2.无向图奇点数为0或2,并且这两个奇点其中一个为起点另外一个为终点。有向图,可以存在两个点,其入度不等于出度,其中一个入度比出度大1,为路径的起点;另外一个出度比入度大1,为路径的终点。 图中所有节点度为偶数,则一定存在欧拉回路 Hierholz

qq_35513792的博客 969

手把手教你用ComfyUI搭建高效AI绘画工作流:从基础到高级技巧

本文详细介绍了如何使用ComfyUI构建高效的AI绘画工作流,从基础配置到高级技巧全面覆盖。通过模块化设计,ComfyUI显著提升显存利用率和创作灵活性,适合从新手到专业用户。文章包含部署指南、工作流搭建、性能优化及行业应用案例,帮助读者快速掌握AI绘画核心技术。

7up55的博客 718

软件破解逆向安全(一)初识内存地址和偏移

工具:CE 内存:数字->存访在电脑中->内存 实例:如何修改植物大战僵尸阳光 内存搜索最核心:过滤数据 先用CE加载植物大战僵尸,如下图 我们可以看到目前我们的阳光数是50,我们尝试在ce里搜索精确数值,4 byte是int整数的表示。 我们发现有很多数据,尝试收集一个阳光变成75再次搜索: 我们发现就一个了,这时我们可以双击Value随便修改阳光的数值了。 这里我们说一下动态和静态地址 动态地址:临时用于存放数据的地址,黑色。特征:重新启动游戏地..

weixin_43781139的博客 2586

欧拉图问题(Euler Graph)

欧拉通路(Euler path or Euler tour):我们从有向图或者无向图中的任意一点出发,将所有的边遍历且仅遍历一次的通路序列我们称之为是欧拉通路,点可多次遍历 欧拉回路(Euler circuit):如果我们的欧拉通路的起点和终点是一样的我们称之为欧拉回路 欧拉图(Euler graph):具有欧拉回路的图称之为欧拉图,规定只有一个顶点的空图属于欧拉图 半欧拉图:只具有欧拉通路的图我们称之为是半欧拉图 1.定理: ①无向图G是欧拉图的充分必要条件是:G是连通图并且没有奇数度顶点 必要性:图G是

qq_52307395的博客 7207

AI训练师三级考证避坑指南|假证辨别+机构套路+OSTA验证

这是最基础的问题,也是最容易忽略的问题。人工智能训练师三级证书本身是有价值的——政府认可的职业技能等级证书、多地紧缺工种补贴、人才引进加分。但正因为有价值,才引来了大量骗子。记住三句话OSTA查不到的证,一分钱都不值声称免考包过的,100%是骗子培训费一次性谈清楚,后续加价直接走人如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》99篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1217

欧拉图、哈密顿图

欧拉图 OI-Wiki 原文 定义 通过图中所有边恰好一次且行遍所有顶点的 通路 称为欧拉通路。 通过图中所有边恰好一次且行遍所有顶点的 回路 称为欧拉回路。 具有欧拉回路 的无向图或有向图称为 欧拉图 。 具有欧拉通路但不具有欧拉回路 的无向图或有向图称为 半欧拉图 。 非形式化地讲,欧拉图就是从 任意一个点 开始都可以一笔画完整个图,半欧拉图必须从 某个点 开始才能一笔画完整个图 。 求欧拉...

EricQian的博客 738

GEE:基于MODIS数据计算NDVI时间序列,并使用Savatsky-Golay(SG)滤波器对其进行平滑处理

优快云@_养乐多_本文将介绍如何在 Google Earth Engine (GEE) 平台中,使用 MODIS 数据计算 NDVI 时间序列,并对该数据集应用 Savitzky-Golay 滤波器,得到了一个新的平滑后的数据集。Savitzky-Golay 滤波器可以有效地去除信号中的噪声,并平滑信号的变化。该方法可以扩展到基于 MODIS 数据计算的任何指数或者波段。

养乐多的博客 1420

Windows环境下Ollama的本地部署方案

本文主要介绍了Windows环境下Ollama的本地部署方案,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. Windows环境安装 3. API调用示例代码

herosunly的博客 11万+

欧拉图,欧拉通路,欧拉回路,Hierholzer算法详解

小岛与河的两岸有七条桥连接。又是板子题, 由于没说是通路还是回路, 所以我们先按无向图找通路起点, 找不到就说明是回路, 随便找个起点就行。我们继续观察,发现我们把数字当作结点,每块骨牌当作边,问题就转化成了一个有n条边的图,我们要让每条边出现一次。由于每个结点出度入度相等都为k,且强连通,于是图中存在欧拉回路,我们求欧拉回路即可得答案。本题时间限制卡在0.25 second,但是点也就7个,边也就200条,还是跑得飞快的。和无向图欧拉回路不同的是,该题要求所得的回路要经过每条边正向反向各一次。

EQUINOX1的博客 4826

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

图-欧拉图(欧拉环游/回路、欧拉迹/通路、Hierholzer算法、Fleury算法)

目录 概念 欧拉迹/通路(一笔画) 半欧拉图 环游 欧拉环游/回路 欧拉图 欧拉定理 推论 Hierholzer 算法 作用 内容 时间复杂度 图 代码 截图 Fleury算法 作用 内容 时间复杂度 图 代码 截图 概念 欧拉迹/通路(一笔画) 通过图中每条边且行遍所有顶点的迹(每条边恰一次的途径),称为欧拉迹(Euler trail)。 半欧拉图 具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图,有且仅有两个度数为奇数的结点。 环游 图的环游(t

关注网络安全、云原生安全 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

欧拉图(欧拉回路与欧拉通路)

在一个图中(有向图或无向图),如果能够从一个结点出发一次性通过所有边且每条边只能通过一次,在通过所有边后能够回到出发点,则该回路称为该图的欧拉回路;不能回到出发点,则该通路称为欧拉通路。含有欧拉回路的图称为欧拉图,含欧拉通路的称为半欧拉图。 最简单的欧拉图: 最简单的半欧拉图: 如何用算法得到一张有向图的欧拉通路呢(无向图算法类似)?我们来看下面这张图: 假设1是起点,则有效的欧拉通路是1–>3–>4–>5–>3–>1–>2;看似我们只需要用最普通的DFS算法(DF

CY2333333的博客 3322

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

图-欧拉图(欧拉环游 回路、欧拉迹 通路、Hierholzer算法、Fleury算法)_欧拉环游算法

因为存在死胡同(运行过程中先遍历某个点,这个点通过入边遍历后删除入边没有出边了,但是图中还有边没有遍历)但其实应该是a->b->a->c。通过图中每条边且行遍所有顶点的迹(每条边恰一次的途径),称为欧拉迹(Euler trail)。具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图,有且仅有两个度数为奇数的结点。不使用栈,若a为起点,遍历哪个点就加入某数据结构(例如队列 ),先遍历c。一个图若包含欧拉环游,则称为欧拉图(Euleriangraph)。寻找半欧拉图、欧拉图的欧拉迹、欧拉环游/回路。

2401_85236365的博客 1495

欧拉图-Hierholzer 算法

Hierholzer 算法求解欧拉通路、回路或欧拉路径 应用:一笔画问题:一个点开始,一笔画完一个图。 欧拉图:从任意一个点开始,一笔画完一个图; 半欧拉图:从某一个点开始,一笔画完一个图; 欧拉通路:通过所有边恰好一次,且路过所有顶点的通路; 欧拉回路:通过所有边恰好一次,且路过所有顶点的回路; 欧拉图:具有欧拉回路的无向图/有向图; 半欧拉图:具有欧拉通路的无向图/有向图 性质特点: 无向图:欧拉图中所有顶点的度数都是偶数;有向图:欧拉图中所有节点的入度和出度都相等; 有向图中的欧拉通路: 欧拉

weixin_43887873的博客 2556

图论-欧拉图-欧拉回路-Euler-Fluery-Hierholzer-逐步插入回路法-DFS详解-并查集

欧拉图性质: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数); 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点; 3.有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度; 4.有向连通图D含有欧拉通路,当且仅当该图为连通图且D中除两个结点外,其余每个结点的入度=出度,且此两点满足deg-(u)-deg+(v)=±1。(起始点...

日拱一卒,功不唐捐 3442

欧拉路径与欧拉回路

下面针对无向图 欧拉回路存在充要条件:连通且所有顶点的度都是偶数 欧拉通路存在充要条件:连通且度为奇数的顶点个数为0或2 欧拉回路存在充要条件证明 引理 若无向图所有顶点的度大于等于2,则存在回路 证明: 考虑路径P:v1 v2 v3....vn为图中最长的路径 与vn相连的点必然在P上(否则假设u没被加入,则v1 v2... vn u这条路径更长,矛盾) 假设u!=但是与vn相连,则回路为u ->P ->vn 大致感觉就是下面...

思维缜密的博客 2663

【图论】欧拉回路

你的qq密码是否在圆周率中出现?一个有意思的编码问题:假设密码是固定位数,设有nnn位,每位是数字0-9,那么这样最短的“圆周率”的长度是多少?或者说求一个最短的数字串定包含所有密码。

qq_23096319的博客 2911

欧拉图算法基础

欧拉图算法基础

gghhb12的博客 3697
上一篇: DFS、回溯算法与 Hierholzer 算法的区别
下一篇: Leetcode(332)——重新安排行程
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值