图的连通性问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
V2
V3 V5 V6
V4
图论算法理论、 实现及应用
V1 V2 4 Vs 8 V1 4 2 2 V3 1 6 4 V4
V7
V8
V9
V10
第8章 图的连通性问题
7 Vt 9
信息学院信息技术教研室
王桂平
连通性初步
能否遍历到所有的顶点?
Question:如果一个无向图是非连通图,从某个顶点出发, Answer:对非连通图,从某个顶点出发进行遍历,只能
顶点
在回 退过 程计 算顶 点的 low 值
dfn low low low low low
0 5 5
1 4 1
1 第一棵子树,回退顺序:0,1,2,4,3
12
6
第二棵子树,回退顺序:8,9,7,6,5
3 1
2 4 3 2 4 1 5 0
5 6
6 7
(c) 7 8 9 9
0
5 5 1 1
顶点u是关节点的充要条件: 1. u是根,且有2个以上的子女 2. u不是根,但存在一个子女w, 使得low[w]>=dfn[u]
3
重连通分量
如果连通图G不是重连通图,那么它可以包括几个重连 通分量。一个连通图的重连通分量是该图的极大连通子 图。 图(1)包含了6个连通分量 0 8 9 1 1 7 7
7
2
4
3
5 6
4
判断关节点的朴素方法
依次去掉每个顶点(及其所关联的边),然后用DFS去搜索整个图, 可得到该图的连通分量的个数,如果是大于2,则该顶点是关节点。 (这种方法复杂度很高,只适合规模较小的题目) 例子:ZOJ 1311
遍历到它所在的连通子图上的所有顶点。 依次从每个未访问过的顶点出发进行遍历,就可以遍历完所 有的顶点,并且可以得到非连通图的连通分量个数。
//依次从每个未访问过的顶点 //出发DFS subnets=0; for( int n=1; n<=nodes; n++ ) { if(!visited[n]) { DFS(n); subnets++; } } //从顶点n出发,DFS遍历 int DFS( int n ) { visited[n]=1; for(int i=1; i<=nodes; i++) { if( node[n][i]==1 && !visited[i] ) DFS(i); } return 0; }
//依次去掉每个顶点(及其所关联的边),用DFS遍历剩下的子图,得连通分量个数
for(int m=1; m<=nodes; m++) { int subnets=0; //子网数目 memset(visited,0,sizeof(visited)); for( int n=1; n<=nodes; n++ ) { if(m==n) continue;//跳过顶点n(并不需要真正去掉顶点n) if(!visited[n]) { DFS(m,n); //去掉顶点m,从顶点n出发DFS subnets++; } } if(subnets>1) SPF++; } 5
6
求关节点的算法
从顶点3出发进行深度优先搜索,得到图(b)所示的生成 树,并改画成图(c)所示的树形形状。 图(c)中每个顶点外侧的数字标明了进行深度优先搜索时 各顶点访问的次序,称为顶点的深度优先数,可以记在 数组dfn中。
0 1
2 4 (a)
8 7
9
5 0Leabharlann Baidu
4 1 3 21 2 4
3 1 10 8 5 6
0 1 2 4 (a) 3
8
7 5 6
9
9
2 4 3 2 4 1 5 0
3 1 5 6 6 7 (c) 7 8
9 9
8 10
顶点u是关节点的充要条件:
1. 如果顶点u是深度优先搜索生成树的根,则u至少有2个子女; 为什么? 删除u,它的子女所在的子树就断开了,你不用担心这些子 树之间(在原图中)可能存在边,因为交叉边是不存在的。 2. 如果u不是生成树的根,则它至少有一个子女w,从w出发,不 可能通过w、w的子孙,以及一条回边组成的路径到达u的祖先。 (这时删去顶点u及其所关联的边,则以顶点w为根的子树就从 搜索树中脱离了。) ? 顶点5为什么是关节点? 3 1 ? 顶点6为什么不是关节点?
(c) 7 8 9 9 8 10
8
回边与交叉边
回边:当且仅当u在生成树中是v的祖先,或者v是u的祖先,非生 成树的边(u,v)才成为一条回边。如图(a)中的(1,3)、(5,7)都是回 边。
交叉边:除生成树的边、回边外,原图中的其他边称为交叉边。 一旦生成树确定以后,那么原图中的边只可能有回边和生成 树的边,交叉边实际上是不存在的。为什么? 假设图(a)中存在边(1,7)(这就是所谓的交叉边),那么顶点 7(甚至其他顶点都)只能位于顶点3的左边这条子树中。
2
关节点及重连通图
关节点:在一个无向连通图G中,当且仅当删去G中的顶 点v及其所关联的边后,可将图分割成2个或2个以上的 连通分量,则称顶点v为关节点(Articulation Point),或 者称为割顶。 0 8 9 1 2 4 3 5 7
图(1)中,顶 点1、3、5、 7都是关节点
6
重连通图:没有关节点的连通图。在重连通图上,任何 一对顶点之间至少存在有2条路径,在删去某个顶点及其 所关联的边时,也不破坏图的连通性。
11
3 1
2 4 3 2 4 1 5 0
0
5 6
8 7
9
1
(c) 2 4 8 10
6 7
7 8 9 9
(a)
前进 回退
3
5
6
在DFS的回退 Low[u]=Min{ dfn[u], 过程计算每个 Min{ low[w] | w是u的一个子女}, 顶点的low值: min{ dfn[v] | (u,v)是一条回边} } 2 3 3 1 4 2 5 6 6 7 7 8 8 10 10 9 9 9 1 1 6 6
Question:哪些顶点是关
8 10
2
3
节点?
3
1
顶点
dfn low low low low low
1
4
4
2
5
6
6
7
7
8
8
10 10
9
9 9
6 1 1
13
6 6 第二棵子树,回退顺序8,9,7,6,5
第一棵子树,回退顺序0,1,2,4,3
问题:找到关节点以后,去掉该关节点,将原 来的连通图分成了几个连通分量?
§ 对根节点:有几个子女,就分成了几个连通分量; § 如果不是根节点:有n个子女w ,使得low[w]>=dfn[u],则 去掉该节点,分成了n+1个连通分量。
14
ZOJ题目
1119 解题报告
15
7 8
6 6 7
9 9
3
5
6
3 2
3 4
4 1 2 5 0
5 7 8
9 9 (b)
(c)
6 7 8 10
7
注意: 如果u和v是2个顶点,且在深度优先搜索生成树中u 是v的祖先,则有dfn[u]<dfn[v],表明u的深度优先数小于
v,u先于v被访问。
3 1
2 4 3 2 4 1 5 0
5 6
6 7
0 1 2 4 3 (a)
8 7 5 6
10
9
2 4 3 2 4 1 5 0
5 6
6 7 (c) 7 8 9 9 8 10
因此,可对图G的每个顶点u定义一个low值,low[u]是 从u或u的子孙出发通过回边可以到达的最低深度优先数。 Low[u]=Min { dfn[u], Min{ low[w] | w是u的一个子女}, min{ dfn[v] | (u,v)是一条回边} } 因此,顶点u是关节点的充要条件是:u或者是具有两个 以上子女的一个生成树的根,或者虽然不是一个根,但 它有一个子女w,使得low[w]>=dfn[u],这时w及其子 孙不存在指向顶点u的祖先的回边。(这时删去顶点u及其 所关联的边,则以顶点w为根的子树就从搜索树中脱离 了。)
//去掉第m个顶点及其所关联的边,从第n个顶点出发进行DFS int DFS( int m, int n ) { visited[n]=1; for(int i=1; i<=nodes; i++) { if( i==m ) continue; //不考虑第m个顶点 if( node[n][i]==1 && !visited[i] ) DFS(m,i); } return 0; }
V3 V5 V6
V4
图论算法理论、 实现及应用
V1 V2 4 Vs 8 V1 4 2 2 V3 1 6 4 V4
V7
V8
V9
V10
第8章 图的连通性问题
7 Vt 9
信息学院信息技术教研室
王桂平
连通性初步
能否遍历到所有的顶点?
Question:如果一个无向图是非连通图,从某个顶点出发, Answer:对非连通图,从某个顶点出发进行遍历,只能
顶点
在回 退过 程计 算顶 点的 low 值
dfn low low low low low
0 5 5
1 4 1
1 第一棵子树,回退顺序:0,1,2,4,3
12
6
第二棵子树,回退顺序:8,9,7,6,5
3 1
2 4 3 2 4 1 5 0
5 6
6 7
(c) 7 8 9 9
0
5 5 1 1
顶点u是关节点的充要条件: 1. u是根,且有2个以上的子女 2. u不是根,但存在一个子女w, 使得low[w]>=dfn[u]
3
重连通分量
如果连通图G不是重连通图,那么它可以包括几个重连 通分量。一个连通图的重连通分量是该图的极大连通子 图。 图(1)包含了6个连通分量 0 8 9 1 1 7 7
7
2
4
3
5 6
4
判断关节点的朴素方法
依次去掉每个顶点(及其所关联的边),然后用DFS去搜索整个图, 可得到该图的连通分量的个数,如果是大于2,则该顶点是关节点。 (这种方法复杂度很高,只适合规模较小的题目) 例子:ZOJ 1311
遍历到它所在的连通子图上的所有顶点。 依次从每个未访问过的顶点出发进行遍历,就可以遍历完所 有的顶点,并且可以得到非连通图的连通分量个数。
//依次从每个未访问过的顶点 //出发DFS subnets=0; for( int n=1; n<=nodes; n++ ) { if(!visited[n]) { DFS(n); subnets++; } } //从顶点n出发,DFS遍历 int DFS( int n ) { visited[n]=1; for(int i=1; i<=nodes; i++) { if( node[n][i]==1 && !visited[i] ) DFS(i); } return 0; }
//依次去掉每个顶点(及其所关联的边),用DFS遍历剩下的子图,得连通分量个数
for(int m=1; m<=nodes; m++) { int subnets=0; //子网数目 memset(visited,0,sizeof(visited)); for( int n=1; n<=nodes; n++ ) { if(m==n) continue;//跳过顶点n(并不需要真正去掉顶点n) if(!visited[n]) { DFS(m,n); //去掉顶点m,从顶点n出发DFS subnets++; } } if(subnets>1) SPF++; } 5
6
求关节点的算法
从顶点3出发进行深度优先搜索,得到图(b)所示的生成 树,并改画成图(c)所示的树形形状。 图(c)中每个顶点外侧的数字标明了进行深度优先搜索时 各顶点访问的次序,称为顶点的深度优先数,可以记在 数组dfn中。
0 1
2 4 (a)
8 7
9
5 0Leabharlann Baidu
4 1 3 21 2 4
3 1 10 8 5 6
0 1 2 4 (a) 3
8
7 5 6
9
9
2 4 3 2 4 1 5 0
3 1 5 6 6 7 (c) 7 8
9 9
8 10
顶点u是关节点的充要条件:
1. 如果顶点u是深度优先搜索生成树的根,则u至少有2个子女; 为什么? 删除u,它的子女所在的子树就断开了,你不用担心这些子 树之间(在原图中)可能存在边,因为交叉边是不存在的。 2. 如果u不是生成树的根,则它至少有一个子女w,从w出发,不 可能通过w、w的子孙,以及一条回边组成的路径到达u的祖先。 (这时删去顶点u及其所关联的边,则以顶点w为根的子树就从 搜索树中脱离了。) ? 顶点5为什么是关节点? 3 1 ? 顶点6为什么不是关节点?
(c) 7 8 9 9 8 10
8
回边与交叉边
回边:当且仅当u在生成树中是v的祖先,或者v是u的祖先,非生 成树的边(u,v)才成为一条回边。如图(a)中的(1,3)、(5,7)都是回 边。
交叉边:除生成树的边、回边外,原图中的其他边称为交叉边。 一旦生成树确定以后,那么原图中的边只可能有回边和生成 树的边,交叉边实际上是不存在的。为什么? 假设图(a)中存在边(1,7)(这就是所谓的交叉边),那么顶点 7(甚至其他顶点都)只能位于顶点3的左边这条子树中。
2
关节点及重连通图
关节点:在一个无向连通图G中,当且仅当删去G中的顶 点v及其所关联的边后,可将图分割成2个或2个以上的 连通分量,则称顶点v为关节点(Articulation Point),或 者称为割顶。 0 8 9 1 2 4 3 5 7
图(1)中,顶 点1、3、5、 7都是关节点
6
重连通图:没有关节点的连通图。在重连通图上,任何 一对顶点之间至少存在有2条路径,在删去某个顶点及其 所关联的边时,也不破坏图的连通性。
11
3 1
2 4 3 2 4 1 5 0
0
5 6
8 7
9
1
(c) 2 4 8 10
6 7
7 8 9 9
(a)
前进 回退
3
5
6
在DFS的回退 Low[u]=Min{ dfn[u], 过程计算每个 Min{ low[w] | w是u的一个子女}, 顶点的low值: min{ dfn[v] | (u,v)是一条回边} } 2 3 3 1 4 2 5 6 6 7 7 8 8 10 10 9 9 9 1 1 6 6
Question:哪些顶点是关
8 10
2
3
节点?
3
1
顶点
dfn low low low low low
1
4
4
2
5
6
6
7
7
8
8
10 10
9
9 9
6 1 1
13
6 6 第二棵子树,回退顺序8,9,7,6,5
第一棵子树,回退顺序0,1,2,4,3
问题:找到关节点以后,去掉该关节点,将原 来的连通图分成了几个连通分量?
§ 对根节点:有几个子女,就分成了几个连通分量; § 如果不是根节点:有n个子女w ,使得low[w]>=dfn[u],则 去掉该节点,分成了n+1个连通分量。
14
ZOJ题目
1119 解题报告
15
7 8
6 6 7
9 9
3
5
6
3 2
3 4
4 1 2 5 0
5 7 8
9 9 (b)
(c)
6 7 8 10
7
注意: 如果u和v是2个顶点,且在深度优先搜索生成树中u 是v的祖先,则有dfn[u]<dfn[v],表明u的深度优先数小于
v,u先于v被访问。
3 1
2 4 3 2 4 1 5 0
5 6
6 7
0 1 2 4 3 (a)
8 7 5 6
10
9
2 4 3 2 4 1 5 0
5 6
6 7 (c) 7 8 9 9 8 10
因此,可对图G的每个顶点u定义一个low值,low[u]是 从u或u的子孙出发通过回边可以到达的最低深度优先数。 Low[u]=Min { dfn[u], Min{ low[w] | w是u的一个子女}, min{ dfn[v] | (u,v)是一条回边} } 因此,顶点u是关节点的充要条件是:u或者是具有两个 以上子女的一个生成树的根,或者虽然不是一个根,但 它有一个子女w,使得low[w]>=dfn[u],这时w及其子 孙不存在指向顶点u的祖先的回边。(这时删去顶点u及其 所关联的边,则以顶点w为根的子树就从搜索树中脱离 了。)
//去掉第m个顶点及其所关联的边,从第n个顶点出发进行DFS int DFS( int m, int n ) { visited[n]=1; for(int i=1; i<=nodes; i++) { if( i==m ) continue; //不考虑第m个顶点 if( node[n][i]==1 && !visited[i] ) DFS(m,i); } return 0; }