news 2026/5/13 14:23:57

【计算机算法与设计-例题】DFS深度优先搜索树与强连通分量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【计算机算法与设计-例题】DFS深度优先搜索树与强连通分量

文章目录

  • 📋 例题一: 理解深度优先搜索树的逻辑
    • 🎯 一、理解"点周游"的逻辑
      • 1.1 什么是"点周游"?
      • 1.2 点周游的执行逻辑
    • 🔄 二、理解"回溯"的逻辑
      • 2.1 什么是"回溯"?
      • 2.2 回溯的触发条件
      • 2.3 回溯的执行过程
    • ✅ 三、理解"顶点标记完成"的逻辑
    • 🔙 四、理解"反向边"的逻辑
    • ➕ 五、理解"交叉边"的逻辑
    • 🔍 六、综合理解:边的分类判断流程
    • 📝 总结
  • 📋 题目二:理解强连通分量
    • 🎯 一、什么是强连通分量?
      • 1.1 强连通的定义
      • 1.2 强连通分量的定义
    • ✅ 二、验证每个强连通分量
      • 3.1 分量1:{a, g, d}、{e, h, k, m, p, s} (***有交叉点的不算)
      • 3.2 分量2:{j}、{b}、{c}、{f}
    • 🔗 三、理解分量图(Component Graph)
    • 💡 四、**核心思想**与常见模式

📋 例题一: 理解深度优先搜索树的逻辑




🎯 一、理解"点周游"的逻辑

1.1 什么是"点周游"?

点周游(Vertex Traversal):按照某种顺序系统地访问图中的所有顶点。

DFS的点周游特点

  • 深度优先:选择一条路径,一直走到头
  • 回溯:走到头后,返回上一个路口(注意是返回到上一个路口
  • 继续探索:尝试其他未走过的路径

1.2 点周游的执行逻辑

核心思想:像走迷宫一样,一条路走到头,然后回溯。

执行步骤

1. 选择一个未访问的起点(如 a) ↓ 2. 访问这个顶点(标记为 GRAY,记录 d[u]) ↓ 3. 按顺序访问它的每个未访问邻居 ↓ 4. 对每个邻居,递归执行步骤2-3(深度优先) ↓ 5. 当所有邻居都访问完,标记为完成(标记为 BLACK,记录 f[u]) ↓ 6. 回溯到父节点 ↓ 7. 如果还有未访问的顶点,从步骤1开始

关键理解

  • 深度优先:从a aab bbp ppf ff,一条路走到头
  • 回溯f ff完成后,回到p ppp pp完成后,回到b bbb bb完成后,回到a aa
  • 继续探索:回到a aa后,继续访问a aa的下一个邻居g gg

🔄 二、理解"回溯"的逻辑

2.1 什么是"回溯"?

回溯(Backtrack):当从某个顶点出发的所有路径都探索完后,返回到父节点,继续探索父节点的其他路径。

2.2 回溯的触发条件

什么时候回溯?

  1. 当前顶点没有未访问的邻居

    • 例如:f ff没有出边,立即回溯
  2. 当前顶点的所有邻居都已访问

    • 例如:p pp的邻居f ff已访问完,回溯到b bb

2.3 回溯的执行过程

回溯的步骤

当前顶点 u 的所有邻居都访问完 ↓ 标记 u 为完成(记录 f[u]) ↓ u 从 GRAY 变为 BLACK ↓ 返回到 u 的父节点 π[u] ↓ 父节点继续访问下一个未访问的邻居

关键理解

  • 回溯不是结束:回溯只是返回到父节点,继续探索(记忆)
  • 回溯是递归返回:就像函数调用栈,完成当前函数后返回调用者
  • 回溯后继续:返回到父节点后,继续访问父节点的其他邻居

✅ 三、理解"顶点标记完成"的逻辑

标记完成的条件

  1. 当前顶点没有出边

    • 例如:f ff没有出边,立即标记完成
  2. 当前顶点的所有邻居都已访问

    • 例如:p pp的邻居f ff已访问完,标记p pp完成
  3. 所有邻居都已处理(访问或跳过)

    • 例如:b bb的邻居p pp已访问完,标记b bb完成

关键理解

  • 完成是递归的:子节点完成后,父节点才能完成
  • 完成时间递增f ( f ) < f ( p ) < f ( b ) f(f) < f(p) < f(b)f(f)<f(p)<f(b)
  • 完成意味着回溯:完成一个顶点后,立即回溯到父节点

时间戳的嵌套关系

重要性质:如果v vvu uu的儿子,则[ d ( v ) , f ( v ) ] ⊆ [ d ( u ) , f ( u ) ] [d(v), f(v)] \subseteq [d(u), f(u)][d(v),f(v)][d(u),f(u)]

例题验证

  • b bba aa的儿子:[ 2 , 13 ] ⊆ [ 1 , 26 ] [2, 13] \subseteq [1, 26][2,13][1,26]
  • p ppb bb的儿子:[ 7 , 12 ] ⊆ [ 2 , 13 ] [7, 12] \subseteq [2, 13][7,12][2,13]
  • f ffp pp的儿子:[ 9 , 10 ] ⊆ [ 7 , 12 ] [9, 10] \subseteq [7, 12][9,10][7,12]

理解

  • 父节点的访问时间区间包含所有子节点的访问时间区间
  • 这反映了DFS的递归性质:先完成子节点,再完成父节点(记忆点)

🔙 四、理解"反向边"的逻辑

反向边(Back Edge):从当前顶点u uu指向其祖先v vv的边。

判断条件

  • 访问边( u , v ) (u, v)(u,v)时,v vvGRAY(灰色)
  • v vvu uu的祖先(在DFS树中,v vvu uu的上层节点)

反向边的作用

  • 检测环:如果存在反向边,说明图中存在环
  • 理解图的结构:反向边揭示了图的循环依赖关系

关键理解

  • GRAY = 正在访问 = 祖先:如果v vv是 GRAY,说明v vv在调用栈中,是u uu的祖先
  • 反向边形成环:反向边( u , v ) (u, v)(u,v)说明存在从v vvu uu的路径(DFS树路径),加上边( u , v ) (u, v)(u,v),形成环

➕ 五、理解"交叉边"的逻辑

交叉边(Cross Edge):从当前顶点u uu指向一个既不是其祖先也不是其后代的顶点v vv的边。

判断条件

  • 访问边( u , v ) (u, v)(u,v)时,v vvBLACK(黑色)
  • d ( v ) < d ( u ) d(v) < d(u)d(v)<d(u)v vvu uu更早被发现)

交叉边的特点

  • v vv已经完成(BLACK)
  • v vvu uu更早被发现
  • u uuv vv不在同一棵子树中

关键理解

  • BLACK + 更早发现 = 交叉边:如果v vv是 BLACK 且d ( v ) < d ( u ) d(v) < d(u)d(v)<d(u),说明v vv在另一个分支中,( u , v ) (u, v)(u,v)是交叉边
  • 交叉边连接不同分支:交叉边连接了DFS树中不同的分支

🔍 六、综合理解:边的分类判断流程

快速判断口诀

白色是树边,灰色是反向, 黑色看时间,前向交叉分。

详细解释

  • WHITE→ 树边:v vvu uu的儿子
  • GRAY→ 反向边:v vvu uu的祖先
  • BLACK→ 看时间戳:
    • d ( u ) < d ( v ) d(u) < d(v)d(u)<d(v)→ 前向边(v vvu uu的后代)
    • d ( v ) < d ( u ) d(v) < d(u)d(v)<d(u)→ 交叉边(u uuv vv无直系关系)

例题中的边分类总结

树边(Tree Edge)

  • ( a , b ) , ( b , p ) , ( p , f ) , ( a , g ) , ( g , h ) , ( h , k ) , ( e , d ) (a, b), (b, p), (p, f), (a, g), (g, h), (h, k), (e, d)(a,b),(b,p),(p,f),(a,g),(g,h),(h,k),(e,d)

反向边(Back Edge,标记 B)

  • ( j , b ) (j, b)(j,b)b bbj jj的祖先
  • ( f , p ) (f, p)(f,p)p ppf ff的祖先
  • ( d , a ) (d, a)(d,a)a aad dd的祖先
  • ( s , g ) (s, g)(s,g)g ggs ss的祖先
  • ( k , h ) (k, h)(k,h)h hhk kk的祖先
  • ( k , k ) (k, k)(k,k):自环,指向自己(GRAY)

前向边(Forward Edge,标记 F)

  • ( a , s ) (a, s)(a,s)s ssa aa的后代,但不在DFS树中(通过其他路径访问)

交叉边(Cross Edge,标记 C)

  • ( e , j ) (e, j)(e,j)j jj是 BLACK,d ( j ) < d ( e ) d(j) < d(e)d(j)<d(e)
  • ( h , f ) (h, f)(h,f)f ff是 BLACK,d ( f ) < d ( h ) d(f) < d(h)d(f)<d(h)
  • ( h , m ) (h, m)(h,m)m mm是 BLACK,d ( m ) < d ( h ) d(m) < d(h)d(m)<d(h)
  • ( g , p ) (g, p)(g,p)p pp是 BLACK,d ( p ) < d ( g ) d(p) < d(g)d(p)<d(g)

📝 总结

核心概念理解

  1. 点周游:深度优先探索,回溯继续
  2. 回溯:子节点完成后,返回父节点
  3. 完成标记:所有邻居访问完,标记为BLACK
  4. 反向边:指向祖先(GRAY)的边
  5. 交叉边:指向已完成且更早发现的顶点(BLACK +d ( v ) < d ( u ) d(v) < d(u)d(v)<d(u))的边

判断流程

访问边(u,v)v是 WHITE? → 树边v是 GRAY? → 反向边v是 BLACK? → d(u)<d(v)? → 前向边 → d(v)<d(u)? → 交叉边

📋 题目二:理解强连通分量


(b) 列出属于以下每个集合的所有边:

  • 反向边的集合:​ (d, a), (m, p), (k, h)
  • 前向边的集合:​ (a, e), (a, s)
  • 交叉边的集合:(j, b), (c, b), (k, f), (d, s)

© 找出强连通分量并绘制分量图。


🎯 一、什么是强连通分量?

1.1 强连通的定义

强连通(Strongly Connected)

  • 有向图中,如果从顶点u uuv vv有路径,v vvu uu也有路径
  • 则称u uuv vv强连通

关键理解

  • 双向可达:不仅u uu能到v vvv vv也能到u uu
  • 有向图特有:无向图中,如果u uu能到v vv,则v vv一定能到u uu(因为边是双向的)

1.2 强连通分量的定义

强连通分量(Strongly Connected Component, SCC)

  • 有向图中,任意两个顶点都互相可达最大顶点集合
  • "最大"意味着:不能再加入其他顶点而仍然保持强连通

关键理解

  • 任意两个顶点:分量的任意两个顶点都互相可达
  • 最大:不能再加入其他顶点
  • 不相交:不同的强连通分量之间没有公共顶点

✅ 二、验证每个强连通分量

3.1 分量1:{a, g, d}、{e, h, k, m, p, s} (***有交叉点的不算)

验证:任意两个顶点都互相可达

关键理解

  • 这些顶点之间存在循环路径
  • 例如:p → e → h → … → p(形成环)
  • 任意两个顶点都可以通过这个环互相到达

3.2 分量2:{j}、{b}、{c}、{f}

验证:单个顶点
理解

  • 单个顶点j jj自己到自己可达(长度为0的路径)
  • 所以{ j } \{j\}{j}是一个强连通分量

为什么j jj不能和其他顶点在一起?

结论:{j} 是一个强连通分量 ✓


🔗 三、理解分量图(Component Graph)

分量图(Component Graph)

  • 将每个强连通分量缩成一个顶点
  • 如果原图中存在从分量A AA到分量B BB的边,则在分量图中添加边A → B A → BAB

关键性质

  • 有向无环图(DAG):分量图一定是有向无环图
  • 拓扑排序:可以对分量图进行拓扑排序
  • 简化问题:将复杂的图简化为分量图,更容易分析

理解

  • 分量图将原图"压缩",每个分量变成一个点
  • 分量图反映了不同强连通分量之间的关系
  • 分量图是DAG,可以进行拓扑排序

💡 四、核心思想与常见模式

核心思想

  • 互相可达:不仅u uu能到v vvv vv也能到u uu
  • 形成环:强连通分量内的顶点形成循环路径
  • 最大集合:不能再加入其他顶点

常见模式

模式1:单个顶点

  • 单个顶点总是自己的强连通分量

模式2:形成环的顶点

  • 如果几个顶点形成环(a → b → c → a),则它们在一个强连通分量中

模式3:复杂的循环结构

  • 多个顶点通过复杂的路径形成循环,则它们在一个强连通分量中

💡记忆口诀:强连通分量互相可达,单个顶点也算分量,形成环的顶点在一起,分量图是DAG可排序!

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

46、网络文件共享与管理全解析

网络文件共享与管理全解析 1. 符号与数字相关 在文件配置和使用中,一些符号和数字有着特定的含义和用途。例如,在 smb.conf 文件里, # 和 ; 用于添加注释;以 . 开头的文件名有其特殊性质,像点文件(dot files),这类文件在某些系统中可能具有隐藏性,其可见性可…

作者头像 李华
网站建设 2026/5/12 7:45:58

百度网盘极速下载方案:告别限速烦恼的完整教程

还在为百度网盘的下载速度而烦恼吗&#xff1f;这款百度网盘下载工具为你提供完美的解决方案&#xff01;通过智能解析技术&#xff0c;轻松获取有效下载地址&#xff0c;让你享受快速稳定的下载体验。 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 …

作者头像 李华
网站建设 2026/5/12 7:44:48

4、构建容器镜像全解析

构建容器镜像全解析 在容器化技术的世界里,构建容器镜像是至关重要的一环。本文将详细介绍构建容器镜像的相关指令、最佳实践以及具体的构建方法。 1. Dockerfile 指令详解 1.1 LABEL 指令 LABEL 指令用于为镜像添加额外信息,这些信息可以是版本号、描述等。建议限制标签的…

作者头像 李华
网站建设 2026/5/12 8:46:29

downkyi视频下载终极指南:10个技巧让你成为下载高手

快速入门指南&#xff08;5分钟上手&#xff09; 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;。 项目地…

作者头像 李华
网站建设 2026/5/12 8:46:11

18、在公共云及本地环境中运行 Docker 并使用 Portainer 进行管理

在公共云及本地环境中运行 Docker 并使用 Portainer 进行管理 1. Amazon Elastic Container Service for Kubernetes(Amazon EKS) Amazon EKS 是我们要介绍的最后一个 Kubernetes 服务,它是三个服务中最新推出的。由于 Amazon 的命令行工具不太友好,我们使用由 Weave 开发…

作者头像 李华
网站建设 2026/5/12 8:46:29

19、Portainer 与 Docker 安全深度解析

Portainer 与 Docker 安全深度解析 Portainer 功能详解 Portainer 是一款强大的 Docker 图形用户界面(GUI)工具,它提供了丰富的功能来管理 Docker 容器、镜像、网络等资源。以下是对其主要功能的详细介绍: 1. 统计信息(Stats) 在 Portainer 的统计页面中,如果你保持…

作者头像 李华