news 2026/6/13 10:35:02

无向图的Hierholzer算法流程(二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
无向图的Hierholzer算法流程(二)

精妙的深度优先搜索

虽然 Hierholzer 算法的流程看起来较为复杂,但我们可以通过一段精妙的代码,将算法流程中的两个步骤合并到同一个深度优先搜索过程中。

在图论的代码实现中,一条无向边一般会被拆成两条有向边。由于 Hierholzer 算法的流程需要我们删除一条无向边,因此我们需要同时删除一条有向边和它的反向边。这样的操作只有利用链式前向星^6(亦称边表)存储无向图时才能在 的时间复杂度内完成,因此下文的代码实现中,均使用链式前向星存储无向图。

Hierholzer 算法的一个 C++ 实现如下。请注意,为了便于分析与讲解,下面给出的代码实现并不是欧拉回路的最优时间复杂度实现。下文中,我们将提出该实现的一个优化。

// 为了方便存储一条边的众多信息,我们定义一个结构体 // // struct Edge { // int fn, nxt; // bool del; // }; // // 其中: // * fn 表示这条有向边的终点 // * nxt 表示链式前向星中,该有向边的后续边的编号,如果没有后续边则值为 0 // * del 表示这条边是否被遍历过了 // // e[] 是一个类型为 Edge 的数组,e[i] 表示链式前向星中编号为 i 的边 // p[] 是一个类型为 int 的数组,p[i] 表示以 i 为起点的第一条边在链式前向星中的编号 // 如果没有以 i 为起点的有向边则 p[i] 的值为 0 // // 为了方便我们查找某一条有向边的反向边,当我们向链式前向星中加入第 i(i 从 1 到 m)条无向边 x - y 时, // 我们会将有向边 x -> y 存储在 e[i * 2],有向边 y -> x 存储在 e[i * 2 + 1], // 这样,e[i] 和 e[i ^ 1] 就互为反向边 // // ans 是一个类型为 vector<Edge> 的变量,用来存储我们找到的回路 void dfs(int sn) { for (int i = p[sn]; i != 0; i = e[i].nxt) { // 这条边已经被遍历过了,跳过 if (e[i].del) continue; // 删除有向边 e[i] 和它的反向边 e[i ^ 1] e[i].del = e[i ^ 1].del = true; // 继续遍历相邻点 dfs(e[i].fn); // 将边 e[i] 加入结果序列中 ans.push_back(e[i]); } }

调用dfs(S)后,ans里就保存了从节点S出发,并回到节点S的欧拉回路。需要注意的是,此时ans中保存的欧拉回路,是我们求出的欧拉回路的倒序。因此,我们还需要调用reverse(ans.begin(), ans.end())ans中所有元素顺序倒转后,才能得到我们想要的欧拉回路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 10:34:21

OpenSpeedy:解锁游戏时间魔法,5分钟实现50倍加速体验

OpenSpeedy&#xff1a;解锁游戏时间魔法&#xff0c;5分钟实现50倍加速体验 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否曾想过在单机游戏中加速无聊的等待过程&am…

作者头像 李华
网站建设 2026/6/13 10:26:15

钢结构焊接设计的一般注意事项

钢结构焊接设计的一般注意事项 一、减少焊接变形和焊接应力 1、焊接变形是焊接过程中焊件受到局部不均匀的加热,由于焊缝在结构上的位置不对称,焊缝截面的不对称以及施焊顺序和施焊方向的不恰当,在焊缝横向和纵向收缩时,就会产生各种不同的焊接变形,如横向和纵向缩短、角…

作者头像 李华
网站建设 2026/6/13 10:23:59

显示的设计和案例-从TMDS底层机制到HPD电平匹配的硬核避坑指南C05

本文为「硬件电路设计」专栏付费内容,聚焦HDMI接口的完整设计逻辑,包含HPD信号的电平陷阱分析、主流芯片平台电路对比,以及可直接落地的设计参考。 做硬件的人有个通病——拿到原理图就开始画,协议规范翻都不翻。结果板子打回来,调试的时候一头雾水,才去翻Spec。 在消费…

作者头像 李华
网站建设 2026/6/13 10:21:52

BMS系统专栏:彻底搞懂!UART、RS232、RS485 三者区别

&#x1f3ac; 渡水无言&#xff1a;个人主页渡水无言 ❄专栏传送门&#xff1a; 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门&#xff1a; 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》 ❄专栏传送门&#xff1a;《产品测评专栏》…

作者头像 李华