图的连通性总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图的连通性总结

boboo

目录

1.图的遍历及应用

1.1.DFS遍历

1.2.DFS树的边分类

1.3.DFS树的性质

1.4.拓补排序

1.5.欧拉回路

2.无向图相关

2.1求割顶

2.2求图的桥

2.3求图的块

3.有向图相关

3.1求强连通分量(SCC划分)

3.2求传递闭包

4.最小环问题

一、图的遍历及应用

1.1 DFS遍历

DFS是求割顶、桥、强连通分量等问题的基础。

DFS对图进行染色,

白色:未访问;

灰色:访问中(正在访问它的后代);

黑色:访问完毕

一般在具体实现时不必对图的顶点进行染色,只需进行访问开始时间和访问结束时间的记录即可,这样就可以得出需要的信息了。

-发现时间D[v]:变灰的时间

-结束时间f[v]:变黑的时间

-1<=d[v]

伪代码:

DFS(G)

for every vertex u ∈ V[G] do

color[u] = WHITE

π[u] = NIL

time = 0

for every vertex u ∈ V[G] do

if color[u] = WHITE then DFS_VISIT(u)

DFS_VISIT(u)

color[u] = GRAY

d[u] = time += 1

for every vertex v ∈ Adj[u] do

if color[v] = WHITE then

π[v] = u

DFS_VISIT(v)

color[u] = BLACK

f[u] = time += 1

1.2 DFS树的边分类

在深度优先遍历中,我们所关心的另一个问题是对产生的搜索树中的分进行分类,这种分类可以发现图中的很多重要信息。一般地,我们可以把图G所产生的深度优先搜索树(或森林)的边分为四类:

A)树枝:深度优先搜索树G中普通的边,即如果结点v在搜索边(u, v)时第一次被发现,那么边(u, v)就是一个树枝。

B)反向边:深度优先搜索树中连结结点u到它的祖先v的那些边,自环也被认为是反向边。

C)正向边:深度优先搜索树中连接顶点u到它的后裔的非树枝的边。

D)交叉边:所有其它类型的边,它们可以连结同一棵深度优先搜索树中的两个结点,只要一结点不是另一结点的祖先(一般来讲两个结点是一种兄弟关系),也可以连结分属两棵深度优先搜索树的结点。

我们可以把DFS遍历算法做一下补允,使之遇到边时能对其进行分类。算法的核心思想在于可以根据第一次被搜索的边所达到的结点v的颜色来对该边(u, v)进行分类(但正向边和交叉分不能用颜色区分出)。

1、白色表明它是树枝。

2、灰色表明它是反向边。

3、黑色表明它是正向边或交叉边,其中,如果d[u] < d[v],则边(u, v)就是正向边;

反之,或d[u] > d[v],则(u, v)就是交叉边。

上述证明比较简单,可根据定义证明。另外,如果图G为无向图的话,那么G的深度优先搜索树中的边只能是树枝或反向边。

在程序具体使显示颜色值以及时间戳可以省略, 用意义更加明确的pre数组和post代替d 和f数组, pre[u]和post[u]代表点u的先序/后序编号, 则检查

(u,v)可以写为

if (pre[v] = -1) then dfs(v) //树边, 递归遍历

else if (post[v] = -1) then show(“B”) //后向边

else if (pre[v] > pre[u]) then show(“F”) // 前向边

else show(“C”); // 交叉边

• pre和post的初值均为-1(0), 方便了判断

程序实现:

1.3 DFS树的性质

•括号结构性质

对于任意结点对(u, v), 考虑区间[d[u], f[u]]和[d[v], f[v]], 以下三个性质恰有一个成立:

–完全分离

– u的区间完全包含在v的区间内, 则在dfs树上u是v的后代

– v的区间完全包含在u的区间内, 则在dfs树上v是u的后代

•定理1(嵌套区间定理):

在DFS森林中v是u的后代当且仅当d[u]

•定理2(白色路径定理):

在DFS森林中v是u的后代当且仅当在d[u]时刻(u刚刚被发现), v可以由u出发只经过白色结点到达. 证明: 由嵌套区间定理可以证明

1.4 拓补排序

算法一:

•对图G使用DFS算法, 每次把一个结点变黑的同时加到链表首部

•定理1: 有向图是DAG当且仅当没有B边

–如果有B边, 有环(易证)

–如果有环c, 考虑其中第一个被发现的结点v, 环中v的上一个结点为u, 则沿环的路径v u是白色路径, 有白色路径定理, u是v的后代, 因此(u,v)是B边

•定理2: 该算法正确的得到了一个拓扑顺序

算法二:

其实还有更方便的方法,不必进行dfs遍历,统计入度的情况即可。

程序实现:(这里只给出DFS的方法)

1.5 欧拉回路

每条边经过一次且仅一次的路径。

经典的递归实现.

算法:从一个点u出发DFS,每次标记边(u,v)和(v,u),递归调用EulerRoute(v),然

后把(u,v)放到栈中.

程序实现:

二、无向图相关

2.1 求割顶

割顶是去掉后让无向图不再连通的点。

求割顶的算法在DFS遍历的算法上形成。

相关文档
最新文档