加载中...

[学习笔记] tarjan

强连通分量学习笔记

一些定义

Graph1

有向图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\)的最小值
    1. \(u\)为根的子树中的结点
    2. 通过以\(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 \]

证明很容易,这里不再证明

割点的判定法则

同理.

posted @ 2022-03-22 12:34  ZQYang  阅读(70)  评论(0)    收藏  举报