基于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)


**在深度遍历树中,割点有两个性质:

*割点当且仅当它有多余一个的儿子,那么它就是割点

*对于除去根的其它任何点u,当且仅当他有某个儿子w使得num(u)<=low(w),那么它就是割点


所以,v1:只有一个儿子,所以不是割点

v2 :num(2)>low(3),不是割点

v3:num(3)< low(4),是割点

v4:num(4)

v5:没有儿子节点,不是割点

v6:num(6)>low(7),不是割点

v7:没有儿子节点,不是割点


因此,割点只有v3,v4

到此,算法结束...




其实,DFS还可以判断一个图是否是强连通图,如果不是必定存在某个点或某些点为起点的深搜无法一次完成


你可能感兴趣的:(数据结构与算法)