[学习笔记] tarjan
强连通分量学习笔记
一些定义
有向图DFS生成树有且仅有一下四类边:
- 树边
tree edge:在上图中是黑色的边,每次搜索还没有访问过的结点时经过的边即为树边. - 回边
back edge:在上图中为红色(\(7\rightarrow1\)),即指向搜索树中指向已经访问过的结点的边 - 兄弟边
brother edge:指向已经访问过,但不是祖先的结点,在上图中为蓝色(\(9\rightarrow7\)) - 前向边
forward edge:不是树边,回边,兄弟边的边(\(3\rightarrow6\))
一个小性质
如果结点\(u\)是极大强连通子图\(G'\)在DFS搜索树上第一个搜到的结点,那么\(G'\)的其他节点一定在以\(u\)为根的子树中,我们称结点\(u\)为强连通分量\(G'\)的根.
简单证明一下上面这个结论,考虑反证法. 若\(u\)的子树的结点集合为\(T\),假设\(\exist v\in G'v, s.t.v\notin T\),则\(u\rightarrow v\)的路径中,必然存在一条边直线\(u\)的祖先或者其他子树,也就是说这条边必然是回边或者兄弟边,那么\(v\)一定比\(u\)先访问到,这与假设矛盾,所以原命题成立.
Tarjan算法求强连通分量
我们维护下面两个变量
- \(dfn_u\):进行
DFS深度优先遍历时\(u\)是第几个被遍历到的 - \(low_u\):能回溯到的最早的已经在搜索栈的结点. 具体地说,\(low_u\)定义为以下结点中\(dfn\)的最小值
-
- 以\(u\)为根的子树中的结点
- 通过以\(u\)为根的子树能够通过非树边到达的所有结点
按照深度优先搜索的顺序DFS序,对于一条边\(u\rightarrow v\),我们分以下情况讨论
-
树边:继续遍历\(v\)的子树,并\(low_u\leftarrow \min\{low_u,low_v\}\)
-
回边:\(low_u\leftarrow \min\{low_u,dfn_v\}\)
若存在一个结点\(u\)满足\(dfn_u = low_u\),则\(u\)是一个强连通分量的根节点.
Tarjan 算法与无向图连通性
定义
给定无向连通图\(G=(V,E)\)
-
对于结点\(x\in E\),如果删除\(x\)和它所连的边后,\(G\)不再连通,我们称\(x\)是无向连同图\(G\)的一个割点
-
对于边\(y\in V\),如果删除\(y\)后,\(G\)不再连同,我们称\(y\)是无向连通图\(G\)的桥
桥的判定法则
无向边\(x\rightarrow v\)是桥,当且仅当\(y\)为搜索树上\(x\)的一个子结点,满足
\[dfn_x<low_y
\]
证明很容易,这里不再证明
割点的判定法则
同理.

浙公网安备 33010602011771号