一、定义
割点集合:
在一个无向连通图中,如果有一个顶点集合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不是树根,且满足存在(