图的连通性总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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遍历的算法上形成。