基本概念
割点:Articulation Point
在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)。
双连通的图:一个没有关节点的连通图称为重连通图(biconnected graph)(双连通图)。
连通度:k,若在连通图上至少删去k 个顶点才能破坏图的连通性。
算法应用
算法应用:通信网络中,用来衡量系统可靠性,连通度越高,可靠性越高。
求解方法
- 暴力求解,依次删除每一个节点v,用DFS(或者BFS)判断是否连通,再把节点加入图中。若用邻接表(adjacency list),需要做V次DFS,时间复杂度为O(V∗(V+E))O(V∗(V+E))
- Jarjan算法,只用一次DFS求解。
第一个方法不多说:
对于第二个方法
我们要维持两个数据结构:
dfn[u]:记录节点u在DFS过程中被遍历到的次序号。
low[u]:记录节点u或u的子树通过非父子边追溯到最早的祖先节点(即DFS次序号最小)。
其中对于low[u]的理解是这样的:当(u,v)为树边时,且v没有被访问过,则low[u]是min(low[u]和low[v])。当v被访问过,如果v不是u的父节点(如果是则说明有重边,不考虑),则(u,v)为回边,则low[u]取min(low[u], dfn[v])。
代码思路解析
#include<iostream>