Day 22 - 图论联通性
1|0强连通分量
1|1简介
在阅读下列内容之前,请务必了解图论相关概念中的基础部分。
强连通的定义是:有向图
强连通分量(
这里要介绍的是如何来求强连通分量。
1|2Tarjan 算法
引入
我们这里要介绍的是在有向图中求强连通分量的
DFS 生成树
在介绍该算法之前,先来了解DFS 生成树,我们以下面的有向图为例:
有向图的
- 树边(
):示意图中以黑色边表示,每次搜索找到一个还没有访问过的结点的时候就形成了一条树边。 - 反祖边(
):示意图中以红色边表示(即 ),也被叫做回边,即指向祖先结点的边。 - 横叉边(
):示意图中以蓝色边表示(即 ),它主要是在搜索的时候遇到了一个已经访问过的结点,但是这个结点并不是当前结点的祖先。 - 前向边(
):示意图中以绿色边表示(即 ),它是在搜索的时候遇到子树中的结点的时候形成的。
我们考虑 DFS 生成树与强连通分量之间的关系。
如果结点
反证法:假设有个结点
Tarjan 算法求强连通分量
在
:深度优先搜索遍历时结点 被搜索的次序。 :在 的子树中能够回溯到的最早的已经在栈中的结点。设以 为根的子树为 。 定义为以下结点的 的最小值: 中的结点;从 通过一条不在搜索树上的边能到达的结点。
一个结点的子树内结点的
从根开始的一条路径上的
按照深度优先搜索算法搜索的次序对图中所有的结点进行搜索,维护每个结点的 dfn
与 low
变量,且让搜索到的结点入栈。每当找到一个强连通元素,就按照该元素包含结点数目让栈中元素出栈。在搜索过程中,对于结点
未被访问:继续对 进行深度搜索。在回溯过程中,用 更新 。因为存在从 到 的直接路径,所以 能够回溯到的已经在栈中的结点, 也一定能够回溯到。 被访问过,已经在栈中:根据 low 值的定义,用 更新 。 被访问过,已不在栈中:说明 已搜索完毕,其所在连通分量已被处理,所以不用对其做操作。
将上述算法写成伪代码:
对于一个连通分量图,我们很容易想到,在该连通图中有且仅有一个
因此,在回溯的过程中,判定
实现
时间复杂度
1|3应用
我们可以将一张图的每个强连通分量都缩成一个点。
然后这张图会变成一个
举个简单的例子,求一条路径,可以经过重复结点,要求经过的不同结点数量最多。
1|4习题
__EOF__

本文链接:https://www.cnblogs.com/So-noSlack/p/18329292.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:So_noSlack,转载请注明原文链接:https://www.cnblogs.com/So-noSlack/p/18329292
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-07-29 第十八节 小组学习
2023-07-29 CF858C 题解
2023-07-29 AT_agc022_a 题解