最小生成树算法详解

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

生成树中顶点数小于n?否

在关联生成树顶点的边中(即边的 一个顶点在生成树中,另一个顶点不在) 取权值最小者
结束
将选中的边加入生成树, 同时将该边的关联顶点加入生成树中
基本要求
从键盘(或数据文件)输入图的信息,用普里姆算法求解给 定无向连通图的最小生成树,最后输出最小生成树中的权值 和所有的边,图的存储结构自行设定。
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
V4
36
42
V5
6
V6
当U集合中加入一个新顶点时,V-U集合中的顶点到 U的最小代价边可能会更新
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
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 }
最小代价生成树
生成树的代价等于其边上的权值之和。
6 V2 5
V1 5
1
5
V4
V3
36
4
2
V1
6
5
1
V2
V4
V3
V5
6
V6
V2 5
6
4
3
V5
V6
V5
V1
1 V4
V3
4
2
V6
最小代价生成树
两种常用的构造最小生成树的方法: ➢ 普里姆算法(prim) ➢ 克鲁斯卡尔算法( Kruskal)
普里姆(Prim)算法
v6
U
V-U
k
adjvex lowcost
v1 v1 v1 615
{v1}
{v2,v3,v4,v5,v6} 3
adjvex lowcost
adjvex lowcost
v3 5
0
v3 5
0
v1 5
v3 6
v3 4
{v1,v3}
v6 2
v3 6
0
{v1,v3,v6}
{v2,v4,v5,v6}
6
{v2,v4,v5 }
adjvex lowcost
adjvex lowcost
adjvex lowcost
adjvex lowcost
v1 v1 v1 615
{v1}
v3 5
0
v1 5
v3 6
v3 4
{v1,v3}
v3 5
0
v6 2
v3 6
0
{v1,v3,v6}
v3 5
0
0
v3 6
0
{v1,v3,v6,v4}
0
0
0
v2 3
最小生成树算法
------prim& Kruskal
生成树的概念
生成树
➢ 一个连通图的生成树是一个极小连通子图,它含有图中全 部顶点,但只有足以构成一棵树的n-1条边。
➢ 生成树不唯一
V2
V2
V1
V4
V6 V5
V3 生成树
V1
V4
V3
V2
V6 V5
V1
V4
V3
V2
V6
V5
V1
V4
V3
V6 V5
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
V1
1 V4
V3
4
2
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
V2 5
V4
V3
4
2
V6
V1 6
V2 5 V3
6
V5
6
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 }
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
(5) {V1 ,V3 ,V6 ,V4 ,V2 ,V5 } { }
普里姆(Prim)算法
开始 生成树中只放置一个顶点
{v2,v4,v5,v6}
6
源自文库
{v2,v4,v5 }
4
{v2,v5 }
2
{v5 }
5
U集合的成员: V-U集合的成员:
6 V2 5
V1
5
1
V3 5
V4
36
42
V5
6
V6
V1
V2 5
1
V4
V3
3
42
V5
V6
顶点i
closedge
v2
v3
v4
v5
v6
U
V-U
k
adjvex lowcost
adjvex lowcost
2
U集合的成员: V-U集合的成员:
6 V2 5
V1
5
1
V3 5
V4
36
42
V5
6
V6
当U集合中加入一个新顶点时,V-U集合中的顶点到 U的最小代价边可能会更新
顶点i
closedge
v2
v3
v4
v5
v6
U
adjvex lowcost
adjvex lowcost
adjvex lowcost
adjvex lowcost
普里姆算法构造最小生成树的过程是从一个顶点U={u0}作初 态,不断寻找与U中顶点相邻且代价最小的边的另一个顶点, 扩充到U集合直至U=V为止。
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
V1
1
V2 5
V4
V3
3
4
2
V5
V6
6 V2 5
V1 5
0
{v1,v3,v6,v4,v2}
0 0 0 0 0 {v1,v3,v6,v4,v2,v5}
{v2,v3,v4,v5,v6} 3
{v2,v4,v5,v6}
6
{v2,v4,v5 }
4
{v2,v5 }
2
{v5 }
5
{}
普里姆算法求最小生成树
• 图采用邻接矩阵表示
v1
6
5
v2
1 v4
55
v3
3 6
42
v5 6 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 }
(5) {V1 ,V3 ,V6 ,V4 ,V2 ,V5 } { }
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
最小代价生成树
普里姆算法求最小生成树:从生 成树中只有一个顶点开始,到顶 点全部进入生成树为止
V1
1
V2 5
V4
V3
3
4
2
V5
V6
V1
V2 V3
36
V5
6
V4 V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
1
2
graph. arac[][] =
3 4
5
6
123456
∞ 6 1 5∞∞ 6 ∞5∞3 ∞ 1 5∞5 6 4 5 ∞ 5 ∞∞ 2 ∞ 3 6 ∞∞ 6 ∞∞4 2 6 ∞
0
{v1,v3,v6,v4}
closedge[2].adjvex=3 .lowcost=5
closedge[5].adjvex=3 .lowcost=6
V1
V2 5 V3
6 V5
V-U
V4
V6 k
{v2,v3,v4,v5,v6} 3
{v2,v4,v5,v6}
6
{v2,v4,v5 }
4
{v2,v5 }
顶点i
closedge
v2
v3
v4
v5
v6
U
adjvex lowcost
adjvex lowcost
adjvex lowcost
adjvex lowcost
v1 v1 v1 615
{v1}
v3 5
0
v1 5
v3 6
v3 4
{v1,v3}
v3 5
0
v6 2
v3 6
0
{v1,v3,v6}
v3 5
0
0
v3 6
adjvex lowcost
v1 v1 v1 615
{v1}
v3 5
0
v1 5
v3 6
v3 4
{v1,v3}
v3 5
0
v6 2
v3 6
0
{v1,v3,v6}
v3 5
0
0
v3 6
0
{v1,v3,v6,v4}
0
0
0
v2 3
0
{v1,v3,v6,v4,v2}
V1
V2 V3
3 V5
V-U
V4
V6 k
{v2,v3,v4,v5,v6} 3
1
5
V4
V3
36
4
2
V5
6
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 }
(5) {V1 ,V3 ,V6 ,V4 ,V2 ,V5 } { }
最小代价生成树
V1
1
普里姆算法求最小生成树:从
V3
生成树中只有一个顶点开始,
到顶点全部进入生成树为止
V1
6
5
1
V2
V4
V3
V5
V6
步骤 (0) (1)
U
V-U
{V1 } { V2 ,V3 ,V4 , V5 ,V6 } {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
最小代价生成树
普里姆算法求最小生成树:从生 成树中只有一个顶点开始,到顶 点全部进入生成树为止
V1
1
V2 5
V4
V3
3
4
2
V5
V6
V1
V2
V4
V3
V5
V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
6 V2 5
V1
5
1
V3 5
V4
36
42
V5
6
V6
当U集合中加入一个新顶点时,V-U集合中的顶点到 U的最小代价边可能会更新
顶点i
closedge
v2
v3
v4
v5
v6
U
adjvex lowcost
v1 v1 v1 615
{v1}
V1
6
5
V2
1
V4
V3
V5
V6
V-U
k
{v2,v3,v4,v5,v6} 3
例如 下图的输出为
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)
普里姆算法的实现
顶点集合如何表示? 最小边如何选择? 一个顶点加入U集合(生成树中)
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
V1
closedge[6].adjvex=3
.lowcost=4
U集合的成员: V-U集合的成员:
6 V2 5
V1
5
1
V3 5
V4
36
42
V5
6
V6
当U集合中加入一个新顶点时,V-U集合中的顶点到 U的最小代价边可能会更新
V1
V2 5 V3
6 V5
V4 2 V6
顶点i
closedge
v2
v3
v4
v5
假设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的最小生 成树。
顶点i与顶点k邻接 顶点k已经在U集合中
如何表示? struct {
int adjvex;
closedge[i].adjvex=k
double lowcost;
closedge[i].lowcost = 0
}closedge[MAX_VERTEX_NUM];
顶点i加入U集合时
U集合的成员: V-U集合的成员:
0
v1 5
v3 6
v3 4
{v1,v3}
V1 5
V2 5
V4
V3
6
4
V5
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
closedge[4].adjvex=1 .lowcost=5
U集合的成员: V-U集合的成员:
6 V2 5
V1
5
1
V3 5
V4
36
42
V5
6
V6
当U集合中加入一个新顶点时,V-U集合中的顶点到 U的最小代价边可能会更新
顶点i
closedge
v2
v3
v4
v5
v6
U
adjvex lowcost
adjvex lowcost
v1 v1 v1 615
{v1}
v3 5
closedge[2].adjvex=1 .lowcost=6
closedge[3].adjvex=1
closedge[4].adjvex=1
.lowcost=1
.lowcost=5
closedge[5].adjvex=1
closedge[6].adjvex=1
.lowcost=∞
.lowcost=∞
相关文档
最新文档