强连通分量算法Tarjan学习笔记

强连通

如果在有向图中,uv 存在一种路径,而 vu 也存在一条路径,那么称uv强连通

如果任意两点都强连通,那么称这个图为强连通图

如果一个非强连通图中存在一个最大的强连通图,那么称这个子图为 强连通分量

比如说下图,1与2强连通,Edge{1,2,3}是强连通图,也是整个图的强连通分量。

Tarjan

tarjan算法基于图的深度优先搜索(DFS)。每一个可能的强联通分类都是搜索树中的一棵子树。

搜索时,把当前搜索树中未处理的节点放入一个栈,回溯时判断栈顶到栈中的节点是否为一个强连通分量。

一些定义

DFN(u) :搜索到节点 u 时的次序。(换句话说,就是搜索的时间戳)。

LOW(u)uu 的子树能够追溯到的最早的栈中节点的次序。

步骤

  • 当第一次搜索到点u时 DFN[u]=LOW[u]=time ;

  • 每搜索到一个点,就把该点压入栈(顶);

  • 当u和v有边相连时:如果v不在栈中(树枝边),搜索 v 节点,并且 LOW[u]=min{LOW(u),LOW(v)} ;如果 v 在栈中(前向边/后向边),此时 LOW[u]=min{LOW[u],DFN[v]}

  • DFN[u]=LOW[u] 时 ,将它以及在它之上的元素弹出栈,此时,弹出栈的结点就构成一个强连通分量;

  • 继续搜索,直到整张图搜索完毕。

这个算法,每条边只会遍历一次,每个点也只会遍历一次,因此如果令边数为 n,点数为 m,那么Tarjan算法的时间复杂度就是 O(n+m)。是一种非常高效的算法。

鸣谢

参考资料如下:

posted @   蒟蒻xiezheyuan  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示