普利姆算法通俗讲解

 

文章作者:duguyue100

今天就来讨论一下贪心法中另一个解决最小生成树的算法:prim算法。在解决最小生成树的算法中,prim算法应该是最优的了,时间复杂是O(n² ㏒n)。下面我们来了解一下算法的运作原理。    在prim算法中,最小生成树是一步步建立起来的,他不同于kruskal算法的方面就是kruskal算法刚开始构造的时候是支离破碎的线连接起来的,而prim算法则是一步一步拓展来的。刚开始的时候,令一个无向图中的任意点(以下称x)作为起点。然后遍历与x连同的所有点,找出最小的点并并入最小生成树的集合中,这样一步一步,直到把图中所有的点都并入生成树的集合中,而他们权值的和,也就是最小的了。另外,再你每次把一条边并上之后,你要考虑的不只是这一条边的联通的边,而是把他们当做一个整体,将所有点除了已经连接上的边外剩下所有的边中选择一个最小的。这但最重要,因为树结构不是一条线,而是一个真正的树一样的形状。
   我们先不给出为什么这样做就是正确的证明。我们知道,对于一个无向图,他的最小生成树有可能只有1棵,也有可能是很多棵,我们的算法只是要找到其中一种,也就是说我们并不关心到底有多少最小生成树,所以我们应该允许结果有不一样的时候,比如对于一个图,分别用kruskal和prim算法得到了不同的最小生成树,但只要两个权值是一样的,那么我们就可以说我们得到的都是正确结果。
   好的,我们来具体从图上看一下prim算法到底是怎么运作的。我们选用的图还是上次讲kruskal算法的时候用的那个图,如下:


prim算法运作图,假定B点是初始点,过程如下:

怎么?不相信有这么神奇?那么你自己动手试一下用C作为起始点看看。
那么怎么实现呢?我们下面给出算法过程:
首先是一个带权连通的无向图G=(V,E)。输出的时候是图G的一棵最小生成树:
第一步:令x是V中任意顶点,令X={x},Y=V-{x};//最小生成树根的初始化
第二步:从E中选择一条边(u,v),使得u∈X,v∈Y,并且(u,v)是顶点集X与Y之间的边中权值最小的;//构造生成树规则
第三步:将u连接到v,令X=X∪{v},Y=Y∪{v};//删去已经加入的边,这一步千万不能忘
第四步:如果Y是空的,那么终止,那么产生的树是最小生成树;否则,返回第二步;//如果是空的,就表明已经生成完毕,因为Y中保存着图一共有多少个顶点,但是我们不要验证集合X,因为我们难以统计图中一共有多少个顶点。如果不是空的,那么回到第二步,继续构造生成树,在这里,建议利用相当于PASCAL中的repeat循环。因为既然是带权连通无向图,一定有2个以上点,所以一定要至少执行一次才能看出生成树到底是什么。
好了,至于prim算法的证明,我在这里就不多讲了。因为大家先要理解了这个算法是怎么运作的,在总结完贪心法的一些算法之后,我会发出一个证明的总汇,因为数学的东西讲多了,虽然能帮助我们从根上了结一个算法的实现,但是讲了这么多,我觉得大家一定很晕,先掌握了。理解是以后的事情。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值