最小生成树算法详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
},V4 , V}2, V5 {}V5
{ }
最小代价生成树
V1
1
普里姆算法求最小生成树: 从生成树中只有一个顶点开
V3
始,到顶点全部进入生成树
为止
V1
6
5
1
V2 V3
V4
V5
V6
步骤 U
V-U
(0) (1)
{}V1 { {V}1 ,V3
V2 {
V,,2,VVV636,},V}V44
, ,
V5 V5
最小代价生成树 V1
普里姆算法求最小生成树: 从生成树中只有一个顶点开 始,到顶点全部进入生成树 为止
1
V3
V4
42
V6
V1
6
5
V2 5 V3 5 V4
6 V5 6
2 V6
步骤 U
V-U
(0) (1)
{}V1 { {V}1 ,V3
V2 {
V,,2,VVV636,},V}V44
, ,
V5 V5
(2) (3)
是 在关联生成树顶点的边中(即边的 一个顶点在生成树中,另一个顶点不在)
取权值最小者
结束
将选中的边加入生成树, 同时将该边的关联顶点加入生成树中
基本要求
从键盘(或数据文件)输入图的信息,用普里姆算法 求解给定无向连通图的最小生成树,最后输出最小生 成树中的权值和所有的边,图的存储结构自行设定。
例如 下图的输出为
最小生成树算法
------prim& Kruskal
生成树的概念
生成树
➢ 一个连通图的生成树是一个极小连通子图,它含有 图中全部顶点,但只有足以构成一棵树的n-1条边 。
➢ 生成树不唯一
V2
V2
V1
V4
V6 V5
V1
V4
V3
V2
V3 生成树
V6 V5
V2
V1
V4
V3
V6 V5
Biblioteka Baidu
V1
V4
V3
V6 V5
1
V2 5 V3
V4
3
42
V5
V6
V1
V2 V3
36 V5 6
V4 V6
步骤 U
V-U
(0) (1)
{}V1 { {V}1 ,V3
V2 {
V,,2,VVV636,},V}V44
, ,
V5 V5
(2) (3) (4) (5)
{V1 },V3 ,V6 { {{{VV1V,11,V,,V4,V,V3V2V}33,},V,}V6V66,,VV44
邻接
一个顶点加入U集合(生成树中)
如何表示?
顶点k已经在U 集合中
struct { int adjvex;
closedge[i].adjvex= k
double lowcost;
}closedge[MAX_VERTEX_NU
36 4 2
V5 6 V6
步骤 U
V-U
(0) (1)
{}V1 { {V}1 ,V3
V2 {
V,,2,VVV636,},V}V44
, ,
V5 V5
(2) (3) (4) (5)
{V1 },V3 ,V6 { {{{VV1V,11,V,,V4,V,V3V2V}33,},V,}V6V66,,VV44
V{V25 ,V2
{}V1 { {V}1 ,V3
V2 {
V,,2,VVV636,},V}V44
, ,
V5 V5
(2) (3) (4)
{V1 },V3 ,V6 {{VV,11V,,4,VVV2}33 },,VV66
{ V{V25 ,V4
},V4 , V}2, V5 {}V5
最小代价生成树 V1
普里姆算法求最小生成树: 从生成树中只有一个顶点开 始,到顶点全部进入生成树 为止
最小代价生成树
生成树的代价等于其边上的权值之和。
V1
6
5
1 V2 5 V3 5 V4
36 4 2
V1
6
5
V5 6 V6
V1
1
1
V2 V3
V4
V2 5 V3
V4
64
3
42
V5
V6
V5
V6
最小代价生成树
两种常用的构造最小生成树的方法: ➢ 普里姆算法(prim) ➢ 克鲁斯卡尔算法( Kruskal)
V{V25 ,V2
},V4 , V}2, V5 {}V5
{ }
最小代价生成树 V1
普里姆算法求最小生成树: 从生成树中只有一个顶点开 始,到顶点全部进入生成树 为止
1
V2 5 V3
V4
3
42
V5
V6
V1
V2 V3
V4
V5
V6
步骤 U
V-U
(0) (1)
{}V1 { {V}1 ,V3
V2 {
V,,2,VVV636,},V}V44
, ,
V5 V5
(2) (3) (4) (5)
{V1 },V3 ,V6 { {{{VV1V,11,V,,V4,V,V3V2V}33,},V,}V6V66,,VV44
V{V25 ,V2
},V4 , V}2, V5 {}V5
{ }
普里姆(Prim)算法
开始 生成树中只放置一个顶点
生成树中顶点数小于n否?
最小代价生成树 V1
普里姆算法求最小生成树: 从生成树中只有一个顶点开 始,到顶点全部进入生成树 为止
1 V3
4 V6
V1
6
5
V2 5 V3 5 V4
64
V5
V6
步骤 U
V-U
(0) (1)
{}V1 { {V}1 ,V3
V2 {
V,,2,VVV636,},V}V44
, ,
V5 V5
(2) {V1 },V3 ,V6 { VV25 },V4 ,
{V1 },V3 ,V6 { {V,1V4,V}3 ,V6
V{V25
},V4 , V}2, V5
最小代价生成树 V1
普里姆算法求最小生成树: 从生成树中只有一个顶点开 始,到顶点全部进入生成树 为止
1
V2 5 V3
V4
42
V6
V1 6
V2 5 V3
V4
6 V5 6 V6
步骤 U
V-U
(0) (1)
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)
普里姆算法的实现
顶点集合如何表示?
最小边如何选择?
顶点i与顶点k
普里姆(Prim)算法
假设N=(V,E)是连通网,TE是N上最小生成树中边的 集合。
算法从U={u0}(u0∈V),TE={}开始,重复执行下述操 作:
在所有u∈U,v∈V-U的边(u,v)中找一条代价最小的边(u0 ,v0),将其并入集合TE,同时将v0并入U集合。
当U=V则结束,此时TE中必有n-1条边,则T=(V,{TE})为N 的最小生成树。
普里姆算法构造最小生成树的过程是从一个顶点 U={u0}作初态,不断寻找与U中顶点相邻且代价最小 的边的另一个顶点,扩充到U集合直至U=V为止。
最小代价生成树
普里姆算法求最小生成树: 从生成树中只有一个顶点开 始,到顶点全部进入生成树 为止
V1
1
V2 5 V3
V4
3
42
V5
V6
V1
6
5
1 V2 5 V3 5 V4