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

强连通

如果在有向图中,\(u\)\(v\) 存在一种路径,而 \(v\)\(u\) 也存在一条路径,那么称\(u\)\(v\)强连通

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

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

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

Tarjan

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

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

一些定义

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

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

步骤

  • 当第一次搜索到点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 @ 2022-01-26 15:03  蒟蒻xiezheyuan  阅读(33)  评论(0编辑  收藏  举报