一、定义
一个无向连通图中,
若删除一条边后,图分裂成两个不相连的子图,则该边为图的一条 割边 (或称 桥 );
若删除一个点及其相连的边后,图分裂成两个及以上不相连的子图,则该点为图的一个 割点 。
一般无向图(不一定连通)的割边和割点就是它各个连通快的割边和割点。
二、时间戳
1 - 定义
在图的深度遍历( DFS ) 过程中,
每个节点 i 第一次被访问的时刻就是 i 的时间戳 dfn[i] 。
如图是 dfn 示意图,
蓝色边是深度优先遍历时走过的边,我们称为 下降边 ;
红色边是未走过的边,我们称为 上升边 。
节点旁的数字为该节点的时间戳。
2 - 性质
DFS 过程中,前 t−1 个时刻已经完成,
目前下一个要访问的点是 c ,那么 dfn[c]=t ,
已知有两个已访问过的点 a , b , dfn[a]<dfn[b]<t ,且 (a,c) , (b,c) 都有边,
则 DFS 时,会优先选择经过 (b,c) 这条边访问 c ,
即将 (b,c) 作为下降边, (c,a) 作为上升边。
从上图中 6 , 7 , 8 号点的情况可以更直观地感受到。
证明:
因为 DFS 的原则就是:能不回溯就不回溯,
既然从 b 能直接到 c ,就不用从 b 回溯到 a 再访问 c 。
这就造成了一个重要的性质: 尽量把连接着上升边的点纳为儿子 ,
三、追溯值
1 - 定义
设 subtree(x) 为以 x 为根的子树,
节点 i 的追溯值 low[i] 为以下节点的时间戳最小值:
-
- subtree(i) 中的节点
-
- 与 i 之间用上升边连接的节点
2 - 性质
根据我们推出的时间戳的性质,
i 会尽量把有上升边的点纳为儿子, i 的儿子也会尽量把有上升边的点纳为自己的儿子。
以此类推, i 想要上升,又不想逆着下降边走,
要么自己就连着上升边;要么就顺着下降边,找子树里的后代要。
这与 low[i] 的定义不谋而合,
因此 low[i] 就是 i 不逆着下降边走,到达的最早的节点的时间戳 。
三、割边
在 DFS 树中, x 是 y 的父亲,
若 dfn[x]<low[y] ,则 (x,y) 是割边。
很好理解,不允许 y 逆着 (x,y) 走和把 (x,y) 删除是等效的,
y 只能靠自己或者后代的上升边与时间戳小于等于 dfn[x] 的点保持连通。
如果这都做不到(即 low[y]>dfn[x] ),那么这棵以 y 为根的子树就完全孤立了。
四、割点
在 DFS 树中, x 是 y 的父亲,
若 dfn[x]<=low[y] ,则 x 是割点,
特别地,若 x 是 DFS 树的根节点,则它至少要有两个儿子,才能是割点。
证明与割边类似,不再赘述。