普利姆算法(prim)求最小生成树(MST)

一、最小生成树相关基础知识

最小生成树相关概念:

带权图:边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。

最小生成树(MST:权值最小的生成树。

生成树和最小生成树的应用:要连通n个城市需要n-1条边线路。可以把边上的权值解释为线路的造价。则最小生成树表示使其造价最小的生成树。
在这里插入图片描述

最小生成树的性质:

MST性质:假设G=(V,E)是一个连通网,U是顶点V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树。

构造网的最小生成树必须解决下面两个问题:
(1)尽可能选取权值小的边,但不能构成回路;
(2)选取n-1条恰当的边以连通n个顶点;

即在有向图中先选取权值最小的点两点连起来,在玄奇选取第二小,以此类推,保证n个点被n-1条权值尽量小的线连接起来。
在这里插入图片描述

二、普利姆算法(prim算法)基本思想

prim算法基本思想:

假设G=(V,E)是连通的,TE是G上最小生成树中边的集合。算法从U={u0}(u0∈V)、TE={}开始。重复执行下列操作:
在所有u∈U,v∈V-U的边(u,v)∈E中找一条权值最小的边(u0,v0)并入集合TE中,同时v0并入U,直到V=U为止。 此时,TE中必有n-1条边,T=(V,TE)为G的最小生成树。

Prim算法的核心:始终保持TE中的边集构成一棵生成树。

三、普利姆求最小生成树算法过程图解

第一步:随意选取起点
第二步:在前一步的基础上寻找最小权值

如下图V1到V8的权值最小,查找一个顶点在U={v1}集合中,另一个顶点在V-U集合中的最小权值,如下图,在红线相交的线上找最小值。
通过图中我们可以看到边v1-v8的权值最小为2,那么将v8加入到U集合,(v1,v8)加入到TE。 状态如下:U={v1,v8};
TE={(v1,v8)};
在这里插入图片描述

第三步:继续寻找最小权值

查找一个顶点在U={v1,v8}集合中,另一个顶点在V-U集合中的最小权值,如下图,在红线相交的线上找最小值。
通过图中我们可以看到边v8-v9的权值最小为4,那么将v9加入到U集合,(v8,v9)加入到TE。 状态如下:U={v1,v8,v9};
TE={(v1,v8),(v8,v9)};
在这里插入图片描述

如此循环一下直到找到所有顶点为止。但需注意以下三点:
(1)每次都选取权值最小的边,但不能构成回路,构成环路的边则舍弃。
(2)遇到权值相等,又均不构成回路的边,随意选择哪一条,均不影响生成树结果。由一个连通图构造的最小生成树可能不唯一,但权值之和是唯一的。
(3)选取n-1条恰当的边以连通n个顶点。
(4)prim算法并不是一定是一条没有分叉的树,每次查找最短路径是基于所有已被归入TE的节点而不是最后归并的那个节点。

四、小结

(1)最小生成树(MST)是指权值最小的生成树。
(2)prim算法是求最小生成树的算法之一,其他算法还有kruskal算法
(3)其时间复杂度:这里记顶点数v,边数e
-邻接矩阵:O(v2) 邻接表:O(elog2v)
(4)prim算法适合稠密图。

参考链接:http://www.360kuai.com/pc/961177175f71f0f13?cota=4&tj_url=xz&sign=360_a9931de8&refer_scene=so_1

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值