双连通分量
无向图的双连通分量跟有向图的连通分量有点像。
先说说一些定义。
时间戳:以某个点vi为起点,dfs到的其他点vj的时间。通常用pre表示
连通图:每两个点间都有路径存在的无向图就叫连通图。
割顶(cut vertex):也叫割点。在某个连通图G中,若去掉某个点i,该图G无法保持所有点连通,那这个点就是割顶。
桥(bridge):类似的,在某个连通图G中,若去掉某个边e,该图G无法保持所有点连通,那这个边就叫桥。
点-双连通:
若一个无向图的点两两间都有两条不相交(经过的点不一样)的路径,那么我们就称这个无向图是点-双连通的。条件等价于任意两条边都在一个简单环内。
不难发现,若一个无向图是点-双连通图,那么就代表这个图内部无割顶(既然有两条不相交的路径,去掉任何一个点都还是可以连通的)。
边-双连通:
类似的,若一个无向图的点两两间都有两条不重合(这个要求低一点,点可以重复,但边不行)的路径,那么我们就称这个无向图是边-双连通的。
在边-双连通图中,去掉任何一条边,这个图都还是连通的。
下面进入正题:
对于一张无向图,它的点-双连通的极大子图称为双连通分量(Biconnected Component)。
而边-双连通的极大子图称为边-双连通分量(edge-biconnected component)。
如上图:虽然{3,4,5}也是点-双连通的,但{3,4,5,6,7}才叫双连通分量,这就是极大子图的意义。另外一个双连通分量是{1,2,3}。还有,整个图{1,2,3,4,5,6,7,8}是边-双连通分量。
还如上图:对于整个图来说,3是割顶。不难发现作为割顶的点会同时存在于多个双连通分量里。而其他点只可能存在于一个双连通分量里。
找连通分量首先要会找割顶。
随便找一个点作为根,强行把无向图转换为一棵树。连回祖先的边我们叫它反向边(要与有向图的反向边区分开)。
不难发现:若某个点v的后代都没有反向边连回v的祖先,就可以得出v是割顶的结论。
用时间戳就可以知道祖孙关系。
若发现某个点后代最多只能连回它自己,则说明这个点及它的后代就是一个双连通分量。
注意:用反向边更新时,不能用连回父亲的边,这条边没意义。