首页 > 代码库 > 无向图的结合点

无向图的结合点

定义:图G(V,E)是连通图,顶点集S是V的子集,若删除S中的所有顶点,将是图不连通,称S是图G的割集。若S={v},则称v为图G的割点(或结合点)。

技术分享

如果一个无向图没有结合点,该图称为双连通图

 

结合点的性质:

性质1: 当且仅当深度优先搜索树的根结点至少有两个以上儿子,则根结点是结合点。

性质2: 当且仅当深度优先搜索树中,v的每以一个儿孙结点不能通过后向边到达v结点的祖先结点,则结点v是结合点

 

在进行遍历时,有向图的边,可以分为:

   树边:深度优先搜索生成树中的边;

   后向边: 与边(u, v)相关联的顶点u和v,在深度优先搜索树中,v是u的祖先,在从(u, v)出发进行搜索时,v已被标记过为访问过的结点;

技术分享

 

求结合点的方法:

对每个顶点v,设立变量pren[v]和backn[v],pren[v]是顶点v的遍历序号,backn[v]是顶点v的后向可达顶点的最小遍历序号;

初始时,backn[v] = pren[v];

若[v,w]是从顶点v出发进行搜索的边,则backn[v]是下列数值中最小者

* pren[v]

* pren[w],若(v,w)是后向边

* backn[w],若(v, w)是树边

 

只要顶点v有一个儿子w,使得backn[w]>=pren[v],则说明v的儿孙w不能通过后向边达到v的祖先,因此v是接合点。

 

算法流程:

从v顶点开始搜索:

(1)把v标记为访问过,初始化pren[v],backn[v],使得指针p指向v的邻接表;

(2)若p为空,处理搜索到的接合点的计数,算法结束;否则,令p指向的邻接点是w;若(v, w)是树边,执行步骤3),否则执行5)

(3)从w出发递归调用深度优先搜索算法,若v是根结点,按照性质1判定v是否为接合点,否则更新v的后向可达顶点的遍历序号,按性质2判定v是否为接合点;

(4)使得p指向下一个邻接点,转步骤2)

(5)若(v, w)是后向边,更新v的后向可达顶点顶点的遍历序号,转步骤4)

技术分享技术分享

 

技术分享

技术分享

技术分享

技术分享

技术分享

 

无向图的结合点