图的连通性及最小生成树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
k = i;
for (j= 1;j<n;j++)
if ((lowcost[j] < mincost) && (lowcost[j]!=0)) {
mincost = lowcost[j];
输出k与closevertex[k]
k = j; }
lowcost[k] = 0; for (j = 1;j<n;j++) /*调整lowcost和closevertex数组的值*/
2.Kruskal算法
Kruskal算法是按边的顺序来构造最小生成树的。其思想 是按图中边的权值由小到大顺序逐个选取边,若选中的边与已 是最小生成树的边不构成回路,就把此边作为最小生成树的边。 如果选取的边与已是最小生成树的边构成回路,则将此边舍去。 由于图是连通的,只要选择n-1条边即得到最小生成树。
ALMJBFC DE GKHI 这三个顶点集分别加上所有依附于这些 顶点的边,便构成了非连通图G3的三个连 通分量。如图7.3(b)所示。
设E(G)为连通子图G中所有边的集合,则从图中任一顶点出发遍历图 时,必定将E(G)分成两个集合T(G)和B(G),其中T(G)是遍历过程中历经的 边的集合。显然,T(G)和图G中所有顶点一起构成连通图G的极小连通子 图,按照7.1节的定义,它是连通图的一棵生成树,并且称由深度优先搜索 得到的为深度优先生成树;由广度优先搜索得到的为广度优先生成树(注 意:生成树不唯一)。例如,图7.15(a)和(b)所示分别为G4的深度和广度 优先生成树。
void prim(int matrix[n][n],int n){
lowcost[0] = 0;
closevertex[0]=0;
for (i=1;i<n;i++) {
lowcost[i] = matrix[0][i];
closevertex[i] = 0; }
for (i=1;i<n;i++) { mincost = HUGE; /*HUGE表示一个大于图中最大权的一个数*/
03
3
7
4
4
1
8
25 6
1
2
5
0
3
4
5
1
2
03
3
4
1
25
1
2
Kruskal算法构造最小生成树的过程
0
3
4
1
5
1
2
03
3
4
1
12 5
2
5
0
3
4
1
25
1
2
03
3
7
4
1
12 5
2
5
Kruskal算法的关键之处是在选取某条边时应判断该边是否与已是生成树的边 形成回路。一种解决方法是将图的顶点划分为集合。开始时假定n个顶点分属于n个 集合,即每个集合中有一个顶点。
课后训练:掌握两种最小生成树的构造方法,完成相关习题。
作业布置:题集7.7
反馈小结:图的连通性,再详细点讲解连通分量;最小生成树 的生成方法,有必要作个比较;同时要让学生知道不同的存储 结构,又是如何实现的,最起码要理解过程。
{0,1,4,5,2,3} 当所有顶点均属于一个集合时,此时图的最小生成树就生成了。
Kruskal算法最坏情况下时间复杂性为O(eloge),其中e为图中边的数目。
解答疑问:学生根据本节内容提出疑惑的知识点,进行解答或 讨论。
小结本节内容: 7.4.1 无向图的连通分量和生成树;7.4.3 最小生成树。
练习
0
3
0
3
0
3
4
DFS生成树
4
BFS生成树
4
5
1
2
5
1
2
5
1
2
对于非连通图,每个连通分量中的顶点集和遍历时走过的边一起构成 若干棵生成树,这些连通分量的生成树组成非连通图的生成森林。例如, 图7.15(c)所示为G3的深度优先生成森林,它由三棵深度优先生成树组成。
最小生成树
问题背景: 假设要在n个城市之间建立通信联络网,则连通n个城市只 需要n-1条线路。这时,自然会考虑这样一个问题,如何在最 节省经费的前提下建立这个通信网。n个城市之间,最多可能 设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n1条,以使总的耗费最少呢? 分析问题(建立模型): 可以用连通网来表示n个城市以及n个城市间可能设置的通 信线路,其中网的顶点表示城市,边表示两城市之间的线路, 赋于边的权值表示相应的代价。现在,我们要选择这样一棵生 成树,也就是使总的耗费最少。这个问题就是构造连通网的最 小代价生成树(MinimumCostSpanningTree)(简称为最小生成树) 的问题。一棵生成树的代价就是树上各边的代价之和。
{0,1,4,5},{2},{3} 下一条边(0,1)的两个顶点属于同一个集合,故舍去。构成边(1,2)的两 个顶点属于不同的集合,应加到生成树中,顶点集合成为:
{0,1,4,5,2},{3} 下一条边(2,5)的顶点也属于同一个集合应舍去,边(3,4)的两个顶点属 于不同的集合,可加到生成树中,顶点集合成为:
图的生成树不是唯一的,从不同的顶点出发可以生成不同的生成树, 但n个顶点的生成树一定有n-1条边,如果图带权,那么怎样才能求出其 最小生成树?这就是我们日常生活经常要考虑的问题?
图
图
1.Prim算法
Prim算法构造最小生成树的方法:最初生成树为空,即 没有一个结点和一条边,首先选择一个顶点作为生成树的根, 然后每次从不在生成树中的边中选择一条权值尽可能小的边, 为了保证加入到生成树中的边不会造成回路,与该边邻接的两 个顶点必须一个已经在生成树中,一个则不在生成树中,若连 通图中有n个顶点,则按这种条件选择n-1边就可以得到这个图 的最小生成树了。
如上例顶点集合为: {0},{1},{2},{3},{4},{5}
当确定图中某条边为最小生成树的一条边时,就将该边的两个顶点所属的两个 集合合并为一个,表示原来属于两个集合的各个顶点已被这条新的边连通。如果选 取的某条边的两个顶点属于同一个集合时,该边应舍去。例如,上述例中,当选取 完(4,5)、(1,5)和(0,4)三条边后,顶点的集合成为:
图的连通性及最小生成树
教学主题:图的连通性及最小生成树
教学内容:7.4.1 无向图的连通分量和生成树;7.4.3 最小生 成树。
教学目的:学会利用遍历获取无向图的连通分量;理解图的生 成树;理解最小生成树并且掌握两种最小生成树的构造算法
教学重点、难点:生成树;最小生成树的构造
教学课时:2
无向图的连通分量和生成树
在对无向图进行遍历时, 对于连通图,仅需从图中任一 顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图 中所有顶点。对非连通图,则需从多个顶点出发进行搜索,而 每一次从一个新的起始点出发进行搜索过程中得到的顶点访问 序列恰为其各个连通分量中的顶点集。
例如,图7.3中的G3是非连通图,按照图 7.14所示G3的邻接表进行深度优先搜索遍 历,三次调用DFS过程(分别从顶点A、D和 G出发)得到的顶点访问序列为:
0 05700
第四次,选取的顶点:2
Closevertex 0
Lowcost
0
51404 00700
第五次,选取的顶点:3
Closevertex 0
Lowcost
0
51404 00000
分析算法:
第一个for循环的执行次数为n-1,第二个for循环中又嵌套了两个for 循环,执行的次数为2(n-1)2。所以Prim算法的时间复杂性为O(n2)。
03
3
7
4
4
1
8
25 6
1
2
5
Φ
0
03 4
1
25 1
5
Prim算法构造最小生成树的过程
03 4
2
03 4
1
5
03
3
7Hale Waihona Puke Baidu
4
1
25
1
2
5
03 4
1
25 1
假设图G有n个顶点,n个顶点依次标记为0,1,2,…,n-1。matrix表 示带权图的邻接矩阵。为了便于选出权最小的边,我们引入两个数组 closevertex和lowcost,closevertex[i]表示最小生成树中的一个顶点, 该顶点和不是最小生成树中的一个顶点i构成的边(closevertex[i],i) 具有最小的权。lowcost[i]表示边(closevertex[i],i)的权。
起初,我们将顶点0作为最小生成树的顶点,所以,closevertex[i]的 值为0,i=1,2,…,n-1。而lowcost[i]为边(0,i)的权,i=1,2,…, n-1。由于n个顶点的生成树共有n-1条边,所以,选择边的过程共需要重复 n-1次。每次扫描数组lowcost,找出当前与生成树中顶点最近的顶点,令 其为w,得到最小生成树的一条边(closevertex[w],w)。然后,令 lowcost[w]=0(表示顶点w已加入最小生成树中)。由于顶点w的加入会引 起lowcost和closevertex的变化,因此,一旦有一个新顶点加入到最小生 成树中,就需要根据具体情况修改数组lowcost和closevertex。
if ((matrix[k][j]<lowcost[j]) && (lowcost[j]!=0)) {
lowcost[j] = matrix[k][j];
closevertex[j] = k; }
}
}
用prim算法构造最小生成树过程中变量的变化情况:
初始
0 1 2 34 5
Closevertex 0
Lowcost
0
00000 4 ∞∞3 ∞
第一次,选取顶点:4
Closevertex 0
Lowcost
0
00404 4 ∞7 0 1
第二次,选取顶点:5
Closevertex 0 5 5 4 0 4
Lowcost
0 26700
第三次,选取的顶点:1
Closevertex 0 5 1 4 0 4
Lowcost