强连通分量算法Tarjan学习笔记
强连通
如果在有向图中, 与 存在一种路径,而 与 也存在一条路径,那么称与强连通。
如果任意两点都强连通,那么称这个图为强连通图。
如果一个非强连通图中存在一个最大的强连通图,那么称这个子图为 强连通分量。
比如说下图,1与2强连通,是强连通图,也是整个图的强连通分量。
Tarjan
tarjan算法基于图的深度优先搜索(DFS)。每一个可能的强联通分类都是搜索树中的一棵子树。
搜索时,把当前搜索树中未处理的节点放入一个栈,回溯时判断栈顶到栈中的节点是否为一个强连通分量。
一些定义
:搜索到节点 时的次序。(换句话说,就是搜索的时间戳)。
为 或 的子树能够追溯到的最早的栈中节点的次序。
步骤
-
当第一次搜索到点u时 ;
-
每搜索到一个点,就把该点压入栈(顶);
-
当u和v有边相连时:如果v不在栈中(树枝边),搜索 节点,并且 ;如果 在栈中(前向边/后向边),此时 。
-
当 时 ,将它以及在它之上的元素弹出栈,此时,弹出栈的结点就构成一个强连通分量;
-
继续搜索,直到整张图搜索完毕。
这个算法,每条边只会遍历一次,每个点也只会遍历一次,因此如果令边数为 ,点数为 ,那么Tarjan算法的时间复杂度就是 。是一种非常高效的算法。
鸣谢
参考资料如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!