最小生成树算法讲解分解

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

V2
V2
V1
V4
V6 V5
V1
V4
V3
V2
V3 生成树
V6 V5
V2
V1
V4
V3
V6 V5
V1
V4
V3
V6
V5
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
2
最小代价生成树
生成树的代价等于其边上的权值之和。
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
(5) {V ,V ,V ,V ,V ,V } { } 西安电子科技大学软件学院
1364
- School of Computer Software, Xidian University, China
2
5
6
最小代价生成树 V1
1
普里姆算法求最小生成树:从 生成树中只有一个顶点开始,
生成树中顶点数小于n? 否 是
在关联生成树顶点的边中(即边的 一个顶点在生成树中,另一个顶点不在)
取权值最小者
将选中的边加入生成树, 同时将该边的关联顶点加入生成树中
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
单元实验五
------最小生成树
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
1
生成树的概念
生成树
一个连通图的生成树是一个极小连通子图,它含有图中全 部顶点,但只有足以构成一棵树的n-1条边。
生成树不唯一
closedge[i].adjvex=k
double lowcost;
closedge[i].lowcost = 0
}closedge[MAX_VERTEX_NUM];
顶点i加入U集合时
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
14
普里姆算法的实现
顶点集合如何表示? 最小边如何选择? 一个顶点加入U集合(生成树中)
如何表示?
顶点i与顶点k邻接 顶点k已经在U集合中
struct { int adjvex;
7
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
V1 1
V3 4 V6
V1
6
5
V2 5
5 V4
V3
6
4
V5
V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 } (1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
V3
到顶点全部进入生成树为止
V1
6
5
1
V2
V4
V3
V5
V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 } (1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
V4
36 4 2
V5 6 V6
当U集合中加入一个新顶点时,V-U集合中的顶点 到U的最小代价边可能会更新
顶点i v2 v3 v4 v5 v6
U
closedge
adjvex lowcost
adjvex lowcost
adjvex lowcost
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
8
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
4
普里姆(Prim)算法
假设N=(V,E)是连通网,TE是N上最小生成树中边的集合。 算法从U={u0}(u0∈V),TE={}开始,重复执行下述操作:
在所有u∈U,v∈V-U的边(u,v)中找一条代价最小的边(u0 ,v0),将 其并入集合TE,同时将v0并入U集合。
U
closedge
V1
V2 5 V3
6 V5
V4 2 V6
V-U
k
adjvex lowcost
v1 v1 v1 615
{v1}
{v2,v3,v4,v5,v6} 3
adjvex lowcost
adjvex lowcost
v3 5
0
v1 v3 56
v3 4
v3 5
0
v6 v3 26
0
{v1,v3} {v1,v3,v6}
V4 V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 } (1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 } (4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
1
V2 5
V4
V3
3
42
V5
V6
V1
步骤 U
V-U
V2 V3
V4
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
V5
V6
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 } (3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
(5) {V ,V ,V ,V ,V ,V } { } 西安电子科技大学软件学院
1364
- School of Computer Software, Xidian University, China
2
5
11
最小代价生成树 V1
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
V1 1 V4
V3 42
V6
V1
6
5
V2 5 V3
6 V5 6
5 V4 2
V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 } (1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
.lowcost=∞
.lowcost=∞
U集合的成员: V-U集合的成员:
6 V2 5
V1
5
1
V3 5
V4
36 4 2
V5 6 V6
当U集合中加入一个新顶点时,V-U集合中的顶点 到U的最小代价边可能会更新
顶点i v2 v3 v4 v5 v6
U
closedge
adjvex lowcost
v1 v1 v1 615
结束
13
基本要求
从键盘(或数据文件)输入图的信息,用普里姆算法求解 给定无向连通图的最小生成树,最后输出最小生成树中的 权值和所有的边,图的存储结构自行设定。
例如 下图的输出为
v1
6
5
v2
1 v4
55
v3
3 6
42
v5 6 v6
weight:15
(v1, v3) (v3, v6) (v6, v4) (v3, v2) (v2, v5) 或者(1, 3) (3, 6) (6, 4) (3, 2) (2, 5)
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
9
最小代价生成树 V1
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
1
V2 5
V4
V3
42
V6
V1 6
V2 5 V3
6 V5 6
15
U集合的成员: V-U集合的成员:
6 V2 5
V1
5
1
V3 5
V4
36 4 2
V5 6 V6
当U集合中加入一个新顶点时,V-U集合中的顶点 到U的最小代价边可能会更新
顶点i v2 v3 v4 v5 v6
U
closedge
adjvex lowcost
v1 v1 v1 615
{v1}
V1
6
5
V2
closedge[4].adjvex=1 .lowcost=5
closedge[6].adjvex=3
.lowcost=4
U集合的成员: V-U集合的成员:
6 V2 5
V1
5
1
V3 5
V4
36 4 2
V5 6 V6
当U集合中加入一个新顶点时,V-U集合中的顶点 到U的最小代价边可能会更新
顶点i v2 v3 v4 v5 v6
{v2,v4,v5,v6}
6
{v2,v4,v5 }
4
closedge[2].adjvex=3 .lowcost=5
closedge[4].adjvex=6 .lowcost=2
closedge[5].adjvex=3 .lowcost=6
U集合的成员: V-U集合的成员:
6 V2 5
V1
5
1
V3 5
1
V4
V3
V5
பைடு நூலகம்V-U
V6
k
{v2,v3,v4,v5,v6} 3
closedge[2].adjvex=1 closedge[3].adjvex=1 closedge[4].adjvex=1
.lowcost=6
.lowcost=1
.lowcost=5
closedge[5].adjvex=1 closedge[6].adjvex=1
5
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
V2 5 3 V5
V1 1 V4
V3 42
V6
V1
6
5
1
步骤 U
V-U
V2 5
5 V4
V3
36
42
V5 6 V6
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 } (1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 } (2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 } (3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
36 V5 6
V4 V6
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 } (1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 } (2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 } (3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
(5) {V ,V ,V ,V ,V ,V } { } 西安电子科技大学软件学院
1364
- School of Computer Software, Xidian University, China
2
5
12
普里姆(Prim)算法
开始 生成树中只放置一个顶点
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
10
最小代价生成树 V1
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
1
V2 5
V4
V3
3
42
V5
V6
V1
步骤 U
V-U
V2 V3
V1
6
5
1
V2 5
5 V4
V3
36
42
V1
6
5
V5 6 V6
V1
1
1
V2
V4
V3
V2 5
V4
V3
6
4
3
42
V5
V6
V5
V6
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
3
最小代价生成树
两种常用的构造最小生成树的方法: 普里姆算法 克鲁斯卡尔算法
{v1}
adjvex lowcost
v3 5
0
v1 v3 56
v3 4
{v1,v3}
V1
V2 5 V3
6 V5
5 V4
4 V6
V-U
k
{v2,v3,v4,v5,v6} 3
{v2,v4,v5,v6}
6
closedge[2].adjvex=3 .lowcost=5
closedge[5].adjvex=3 .lowcost=6
当U=V则结束,此时TE中必有n-1条边,则T=(V,{TE})为N的最小 生成树。
普里姆算法构造最小生成树的过程是从一个顶点U={u0}作 初态,不断寻找与U中顶点相邻且代价最小的边的另一个顶 点,扩充到U集合直至U=V为止。
西安电子科技大学软件学院 - School of Computer Software, Xidian University, China
相关文档
最新文档