当前位置: 首页 > news >正文

Hierholzer 算法

算法概述

Hierholzer 算法是一种用于在有向图无向图中寻找欧拉回路欧拉通路的高效算法。它由德国数学家 Carl Hierholzer 于 1873 年提出。

  • 欧拉回路:一条遍历图中每条边恰好一次,并最终回到起点的回路。

  • 欧拉通路:一条遍历图中每条边恰好一次,但不一定回到起点的路径。

该算法以其简洁性和 O(|E|) 的线性时间复杂度而闻名。

算法的前提条件

在应用 Hierholzer 算法之前,必须首先判断图是否存在欧拉回路或通路。

  1. 无向图

    • 欧拉回路:所有顶点的度数为偶数

    • 欧拉通路:恰好有 0 个或 2 个顶点的度数为奇数。如果有两个奇度数顶点,它们分别是路径的起点和终点。

  2. 有向图

    • 欧拉回路:每个顶点的入度等于出度

    • 欧拉通路:恰好有一个顶点的出度比入度大 1(起点),恰好有一个顶点的入度比出度大 1(终点),其余所有顶点的入度等于出度。

如果图不满足上述条件,则不存在欧拉回路或通路。


算法步骤(用于求欧拉回路)

假设我们已知图满足存在欧拉回路的条件。

  1. 选择起点:从图中任选一个顶点作为当前顶点 v(对于欧拉回路,任意顶点都可作为起点)。将其压入一个栈 stack 中。

  2. 深度优先遍历

    • 只要当前顶点 v 还有未访问的边,就执行以下循环:
      a. 从 v 的邻边中任意选择一条未访问的边 (v, u)
      b. 将这条边标记为已访问。
      c. 将顶点 v 压入栈 stack
      d. 将当前顶点移动到 u(即令 v = u)。

  3. 回溯与构建回路

    • 当当前顶点 v 没有未访问的边时(意味着你走到了一个“死胡同”),这个顶点必然是回路的一部分。

    • 将 v 加入到你的结果列表(或链表)circuit 的头部

    • 从栈 stack 中弹出栈顶元素,并将其设为新的当前顶点 v(即回溯到上一个顶点)。

  4. 循环与结束

    • 重复步骤 2 和 3,直到栈 stack 为空,并且当前顶点 v 也没有未访问的边为止。

    • 此时,列表 circuit 中存储的就是逆序的欧拉回路。

最终结果:列表 circuit 中从尾到头的序列,或者直接将其反转,即为从起点出发的欧拉回路。


算法演示(无向图)

假设我们有以下无向图,所有顶点度数均为偶数,存在欧拉回路。

    1/ \2---3/ \ / \
4---5---6

我们以顶点 1 为起点。

  1. stack = []circuit = []v = 1

  2. DFS 开始:从 1 出发,我们选择路径 1 -> 2 -> 5 -> 3 -> 1。此时形成了一个环,但并未遍历所有边。

    • 栈 stack 现在为 [1, 2, 5, 3]

    • 当前顶点 v = 1,并且它没有未访问的边了(因为边 1-2 和 1-3 都已访问)。

  3. 回溯

    • 将 1 加入 circuitcircuit = [1]

    • 弹出栈顶 3v = 3

    • 检查 3,发现它还有未访问的边(3 -> 53 -> 6)。

  4. 再次 DFS:从 3 出发,选择路径 3 -> 5 -> 6 -> 3

    • 栈 stack 变为 [1, 2, 5, 3, 5, 6]

    • 当前顶点 v = 3,没有未访问的边了。

  5. 回溯

    • 将 3 加入 circuitcircuit = [3, 1]

    • 弹出栈顶 6v = 66 没有未访问边。

    • 将 6 加入 circuitcircuit = [6, 3, 1]

    • 弹出栈顶 5v = 55 没有未访问边。

    • 将 5 加入 circuitcircuit = [5, 6, 3, 1]

    • 弹出栈顶 3v = 3。(这个 3 是第一次 DFS 时压入的)

    • 将 3 加入 circuitcircuit = [3, 5, 6, 3, 1]

    • 弹出栈顶 5v = 5。(第一次 DFS 时压入的)

    • 将 5 加入 circuitcircuit = [5, 3, 5, 6, 3, 1]

    • 弹出栈顶 2v = 2。检查 2,发现它还有未访问的边(2 -> 4)。

  6. 最后一次 DFS:从 2 出发,选择路径 2 -> 4 -> 5 -> 2

    • ...(过程类似)

  7. 最终回溯:最终,栈被弹空,circuit 中存储了完整的回路。
    circuit = [2, 5, 4, 2, 5, 3, 5, 6, 3, 1]

欧拉回路(从 1 开始阅读 circuit):1 -> 3 -> 6 -> 5 -> 3 -> ... 或者将 circuit 反转得到正序:1, 2, 4, 5, 2, 3, 5, 6, 3, 1。可以验证这条路径遍历了所有边且回到起点。

http://www.dtcms.com/a/554353.html

相关文章:

  • 一文读懂分辨率:从概念到硬件应用,解锁视觉体验新高度
  • ppt图标网站链接怎么做珠海做网站哪间好
  • 上海网站开发招聘响应式网站和自适应网站
  • 蓝图网站建设网站开发推荐书籍
  • 网页站点什么意思软件定制公司设计方案
  • 湖北智能网站建设找哪家网站 提示危险
  • 垂直类网站怎么做织梦企业网站
  • Excel怎么批量快速修改批注?
  • TikTok限流:为什么TikTok视频没流量、零播放
  • 基于eeg脑电的认知负荷公开数据集
  • 织梦网站怎么做投票wordpress资源下载类主题
  • 安论坛网站建设网站界面建议
  • 基于电鱼 ARM 工控机的井下AI故障诊断方案——让煤矿远程监控更智能、更精准
  • 彩票网站该怎么建设wordpress建站过程
  • 织梦网站首页模板更换做网站需要多少人
  • 光刻胶分类与特性——g/i线光刻胶及东京应化TP-3000系列胶典型配方(上)
  • 医院哪个科室负责网站建设广州网站排名优化服务
  • 三轴云台之智能决策技术
  • 电子商城平台wordpress评论框优化
  • 专业网站建设模板下载小语种网站建设要点
  • 2025百度网盘提速解除限速
  • 管理中的心理学问:职场的合作模式,
  • 从演示到生产:构建可靠 AI 系统的 12-Factor Agent 方法论综合分析
  • 怎么介绍自己做的静态网站wordpress 设置导航
  • 登录网站后没有转页面引流推广接单
  • 电子电力技术的控制电路学习记录分享2
  • 操作系统基础·1 基础知识
  • 网易科技专访 GMI Cloud 创始人CEO Alex Yeh:以“产品+布局+服务”构建全球竞争力
  • 从零理解无感BLDC控制:STC官方开源方案原理图详解
  • 算术运算符与比较运算符