数据结构复习–求图的关节点(Tarjan算法)
文章目录
重连通图的关节点(割点)
关节点
若连通图中某个顶点和其相关联的边被删去后,该连通图被分割成两个或两个以上的联通分量,则称此节点为关节点(割点)。
重(双)连通图
没有关节点的连通图称为双连通图。
即从一个双连通图中删去任何一个顶点及其想关联的边,它仍为一个连通图。
深度优先生成树与回边
从图中任意顶点开始,执行深度优先搜索并在顶点被访问时给它们编号。
而对于图中实际存在而深度优先生成树中不存在的边,称为回边(v,w)或背向边(v,w)。
如下例,虚线部分表示回边。
Visited数组与Low数组
visited数组
第一次对图执行深度优先搜索时,依次访问节点,同时按访问顺序对节点编号。对于每一个节点v,我们称其先序序号为visited[v]。
low数组
然后对深度优先搜索树上的每一个节点v,计算编号最低的顶点,称之为low[v]。
其意义为(个人理解):通过该点,经过零条或多条边及最多一条回边,可以到达的顶点的编号的最小值。例如上图中的C点,其先序编号为3,但可首先通过一条边达到D点,并通过D的回边到达A,所以其low数组编号,及可到达的最低节点编号为1。
上图中顶点的数字标注为visited[v]/low[v]。
Low数组求法
解释:对于任意一个顶点V,其low数组值为自身先序编号(visited[v]),其所有孩子节点的low值的最小值,与其通过回边相连的祖先节点K的先序编号(visited[k])这三者中的最小值。
关节点的判定
1.若生成树中根节点顶点V,其子树个数大于1,则该节点一定为关节点(易理解)。
2.对于非根节点v,它是割点当且仅当它有某个儿子w,使得Low[w]>=Visited[v]。注:该条件在根处总是满足,所以需要进行特别判断。
上例中顶点C与D为关节点。
Low[w]>=Visited[v]的理解:
Low[w]>=Visited[v]含义为,v有某个孩子w,其可到达的节点的最低先序编号大于等于其父亲的先序编号。即w一定不可能到达比v先序编号低的节点(深度优先搜索中比v先访问的节点),则删除节点v后,w一定不能与v之前的节点相连,则该图不为连通图。
Tarjan算法
Tarjan算法为求关节点的常用算法,其时间复杂度为O(V+E)。
void