一、定义
割点集合:
在一个无向连通图中,如果有一个顶点集合V,删除顶点集合V以及与V中顶点相连(至少有一端在V中)的所有边之后,原图不连通,就称这个点为割点集合。
一个图的点连通度: 最小割点集合的中的顶点数,在图G中,去掉任意K-1个顶点后(1<=K<=N),所得的子图仍然连通,去掉K个顶点后不连通,K就是图G的点连通度。
割边集合:
在一个无向连通图中, 如果有一个边集合,删除这个边以后,原图不连通,就称这个点集为割边集合。
一个图的边连通度: 最小割边集中的边数。在图G中,去掉任意K-1条边后(1<=K<=N),所得的子图仍然连通,去掉K条边后不连通,K就是图G的边连通度。
点双连通度:如果一个无向连通图的点连通度大于1,则称该图是点双连通的(point biconnected),简称双连通或者重连通(即删去任意一点原图仍然连通)。
割点: 一个图有割点,当且仅当这个图的点连通度为1时,割点集合的唯一元素被称作割点(cut point)(即删去割点原图不连通)。一个图可能有多个割点。
下图的3号顶点就是割点。
边双连通度:如果一个无向连通图的边连通度大于1,则称该图是边双连通的(edge biconnected),简称双连通或者重连通(即删去任意一边原图仍然连通)。
桥: 一个图有桥,当且仅当这个图的边连通度为1时,割边集合的唯一元素被称作桥(bridge)(即删去桥原图不连通)。一个图可能有多个桥。
如图边(1,2)就是桥
两个错误猜想:
XXX 两个割点之间的边一定是桥。桥的两个端点一定是割点。
如下面这两个例子就是反例:
我们可以知道,点双连通和边双连通都可以称作是双连通,但是这并不意味它们是等价的。
双连通分量:在图G{G}G的所有子图G′{G'}G′中,如果G‘{G‘}G‘是双连通的,则称G′{G'}G′为双连通子图。如果一个双连通子图G′{G'}G′,他不是任何一个双连通子图的真子集,则G′{G'}G′为极大双连通子图。双连通分量就是图的极大双连通子图。特殊的是点双连通分量又叫做块。
边双连通分量一定是点双连通分量,但点双连通分量不一定是边双连通分量。如:
图无割点所以是点双连通分量,图有桥所以不是边双连通分量。
二、Tarjan算法
对,就是之前求强连通分量的算法。这次我们通过求DFN和Low的值来得到割点和桥。
先对图做DFS,因为是无向图,没有横叉边,所以DFS过程中遇到三种边:
来复习一下。
树枝边:DFS时经过的边,即DFS搜索树上的边。
前向边:与DFS方向一致,从某个结点指向其某个子孙的边。
后向边:与DFS方向相反,从某个结点指向其某个祖先的边。
DFN(u{u}u)依旧是u{u}u在DFS中被搜到的时间戳。
Low(u{u}u)表示DFS中u{u}u不通过父顶点能访问到的祖先顶点中最小的时间戳。
根据定义,则有:
如果(u,v){(u,v)}(u,v)为树枝边,u{u}u为v{v}v的父结点,则Low(u{u}u) = Min{Low(u{u}u),Low(v{v}v)}。
如果(u,v){(u,v)}(u,v)为后向边,u{u}u不为v{v}v的父结点,则Low(u{u}u) = Min{Low(u{u}u),DFN(v{v}v)}。
1.判断割点
只需要满足下面两个条件的任意一个,点u{u}u即是割点。
-
u{u}u是树根,那么只要u{u}u的子树个数只要超过1,那么u{u}u就是割点。
因为无向图DFS的搜索树中没有横叉边,所以如果有多个子树,那么这些子树之间是不会有边相连的,只要把树根去掉,子树就会变成独立的块,u{u}u一定是割点。子树的个数也肯定要大于1,因为如果是1,那么连通分量的个数在去掉点u{u}u后还是1,这不符合割点的定义。 -
u{u}u不是树根,且满足存在(u{u}u,v{v}v)为树枝边,(u{u}u在搜索树中是v{v}v的父亲),并且DFN(u{u}u) <= Low(v{v}v)。
此时,如果删除u{u}u,v{v}