最小生成树之Prim(普里姆)算法

来源:互联网 发布:游戏编程教程视频 编辑:程序博客网 时间:2024/06/05 15:56

关于什么是Prim(普里姆算法)?

       在实际生活中,我们经常碰到类似这样的一类问题:假设要在n个城市之间建立通信联络网,

则连通n个城市只需要n-1条线路。这时,我们需要考虑这样一个问题,如何在最节省经费前提

下建立这个通信网.换句话说,我们需要在这n个城市中找出一个包含所有城市的连通子图,使得

其所有边的经费之和最小. 这个问题可以转换为一个图论的问题:图中的每个节点看成是一个城市,

节点之间的无向边表示修建该路的经费,即每条边都有其相应的权值,而我们的目标是挑选n-1条

边使所有节点保持连通,并且要使得经费之和最小.

       这里存在一个显而易见的事实是: 最优解中必然不存在循环(可通过反证法证明). 因此,最后找

出的包含所有城市的连通子图必然没有环路。这种连通且没有环路的连通图就简称为树,而在一个

连通图中删除所有的环路而形成的树叫做该图的生成树.对于城市建立通信连通网,需要找出的树由

于具有最小的经费之和,因此又被称为最小生成树(Minimum Cost Spanning Tree),简称MST.


 基本思路?

  由于生成树必须包含原图里面的所有节点,关键的问题就在于边的选择,怎么才能找出n-1条边,

使得所有节点连通,并且权重最小呢? 这里,我们先来看看MST有什么特点设有上图所示的最小生

成树T,如果删除边(u,v)T,则T将被分解成两个子树:T1和T2,因此,T1和T2分别是其所包含节点的最

小生成树,此处可用反证法证明:如果T1(也可假设为T2)不是其所包含节点的最小生成树,那么,势必

还存在的生成树T',那么,T'+w(u,v)+T2<T1+w(u,v)+T2,这与我们的假设T是最小生成树相矛盾,

故结论成立.

这就是最小生成树的最优子结构性质,在细想一下,MST也包含了重叠子问题的性质,那么似乎我们

可以用动态规划来解决.但如果用动态规划来解决MST,其时间复杂度是指数级别的,显然不是太可取,

我们需要找寻更好的方法.既然MST满足最优子结构性质,那么它是否满足贪婪选择属性呢?


为了更好地理解最小生成树请看如下的例子:

加入一个地区有9个城镇,镇长要求你把这九个城镇联通起来,但是要求消耗最少,就是走的路最少。

如图:

代表九个城镇,并且相邻城镇之间的道路消耗已经标了出来,要求联通所有消耗最好。

那么可以得到如下几种情况:

1.

总消耗:=11 + 26 + 20 + 22 + 18 + 21 + 24 + 19 = 161


2、

总消耗:=8+12+10+11+17+19+16+7= 100


3、



总消耗:=8+12 + 10+11 +16 +19 + 16 +7 = 99

综上三图可知最后一个以微小的差距赢了第二个。

这种就叫做最小生成树。


对于Prim的算法

设图G=(V,E),U是顶点集V的一个非空子集,如果(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,

则必存在一棵包含边(u,v)的最小生成树.

上述的性质可以通过反证法证明,如果(u,v)不包含在G的最小生成树T中,那么,T的路径中必然存

在一条连通U和V-U的边,如果将这条边以(u,v)来替换,我们将获得一个权重更低的生成树,这与T

是最小生成树矛盾.既然MST满足贪婪选择属性,那么,求解最小生成树的问题就简化了很多。

总结一下,具体的步骤大概如下:

构建一棵空的最小生成树T,并将所有节点赋值为无穷大.

  1. 构建一棵空的最小生成树T,并将所有节点赋值为无穷大.
  2. 任选一个节点放入T,另外一个节点集合为V-T.
  3. 对V-T中节点的赋值进行更新(由于此时新加入一个节点,这些距离可能发生变化)
  4. 从V-T中选择赋值最小的节点,加入T中
  5. 如果V-T非空,继续步骤3~5,否则算法终结

这就是最小生成树和Prim算法的讲解。




0 0
原创粉丝点击