基于DFS的求割点算法
Posted Airsolstice
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于DFS的求割点算法相关的知识,希望对你有一定的参考价值。
基于DFS的求割点算法:
笔记;
图的双连通性:就是图中不存在割点的图
双连通性的作用:具有双连通性的网络,不会因为一个局域网瘫痪,而导致网络全部瘫痪;因为,每个点与点的联系在双连通图中不是唯一的,就是说去掉一个点这个同不会变成两个不关联的点集
实现思路:
**对每一个点都都进行测试,当删除这个点和这个点的相关边,DFS搜索能否一次遍历完所有点,如果可以,则这个点不是割点;如果不可以,则这个点是割点
这个方法实现起来,其实很简单,维护一张邻接矩阵;然后在删除点和相关边后,执行DFS算法,判断,即可
**另一种思路是:
设:这张图是连通的
准备工作:求出这张图的邻接表,求出这张图的边集,点集
实现过程:
“”按照DFS搜索遍历一次图,将遍历序列编号(按从小到大的顺序,即根为1),将遍历走过的边集记录,称为树边集
**将树边集的反向边集求出,称为反树边集
**将图的边集减去树边集,反树边集,得到一个背边集
**
**以v1为起点,执行深搜,得到序列:num(x)={1,2,3,4,5,6,7 }
边集={{1,2},{1,3},{2,1},{2,3},{3,1},{3,2},{3,4},{4,3},{4,5},{4,6},{4,7},{5,4},{6,4},{6,7},{7,4},{7,6}}
点集={1,2,3,4,5,6,7}
树边集={{1,2},{2,3},{3,4},{4,5},{4,6},{6,7}}
反树边集={{2,1},{3,2},{4,3},{5,4},{6,4},{7,6}}
边集-树边集-反树边集={{1,3},{3,1},{4,7},{7,4}}
背边集=形如{u,w}且num(w)>num(u)={{3,1},{7,4}}
找出背边集的作用是为了找出每个点的最小背边(由于图的原因,并没有多条背边的比较)
取出一条背边{u,w},维护一个low(x)数组,初始值都为自己本身
若num(w)<num(x)<=num(u),则将w赋值给low的x位置,得到low(x)={1,1,1,4,5,4,4}
**在深度遍历树中,割点有两个性质:
*割点当且仅当它有多余一个的儿子,那么它就是割点
*对于除去根的其它任何点u,当且仅当他有某个儿子w使得num(u)<=low(w),那么它就是割点
所以,v1:只有一个儿子,所以不是割点
v2 :num(2)>low(3),不是割点
v3:num(3)< low(4),是割点
v4:num(4)<low(5),是割点
v5:没有儿子节点,不是割点
v6:num(6)>low(7),不是割点
v7:没有儿子节点,不是割点
因此,割点只有v3,v4
到此,算法结束...
其实,DFS还可以判断一个图是否是强连通图,如果不是必定存在某个点或某些点为起点的深搜无法一次完成
以上是关于基于DFS的求割点算法的主要内容,如果未能解决你的问题,请参考以下文章