菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
267
0

Kruskal与Prim

原创
05/13 14:22
阅读数 5375

一、最小生成树

  在无向图中,连通且不含圈的图称为树(Tree)。给定无向图G=(V,E),连接G中所有点,且边集是E的子集的树称为G的生成树(Spanning Tree),而权值最小的生成树称为最小生成树(Minning Spanning Tree,MST)。

二、Kruskal

步骤:

  1、将所有的边按照从小到大的顺序排列

  2、从小到大一次考量每条边(u,v),如果u和v不在同一连通分量,那么把(u,v)加入连通分量

  3、重复步骤2,直到图中所有节点都在同一连通分量中

图解:

   

 

原理:

  如果u和v在不同的连通分量中,那么加入(u,v)一定是最优的。为什么呢?

 下面用反证法:如果这条边不在最小生成树中,它连接的两个连通分量最终还是要连起来的,通过其他的连法,那么另一种连法与这条边一定构成了环,而环中一定有一条权值大于这条边的边,用这条边将其替换掉,图仍旧保持连通,但总权值减小了。也就是说,如果不选取这条边,最后构成的生成树的总权值一定不会是最小的。

三、Prim

步骤:

  1、初始化,Vnew = {x},其中x为集合V中的任意节点(起始点),Enew = {}

  2、在集合E中选取权值最小的边(u, v),其中u为集合Vnew中的元素,而v则是V中没有加入Vnew的顶点(如果存在有多条满足                前述条件即具有相同权值的边,则可任意选取其中之一)。将v加入集合Vnew中,将(u, v)加入集合Enew中;

  3、重复操作2,直到Vnew = V

图解:

  

 

 证明:

   prim生成的树为T0, 最小生成树(MST)为Tmin

  两棵树的边从小到大权重比较,设第一个属于 T0 但不属于 Tmin 的边为 ed1, 连接该边的两个顶点为 (vs, ve1)。同时存在第一个属          于 Tmin 但不属于 T0 的边为 ed2, 连接该边的两个顶点为 (vs, ve2)。

  两个边的起点相同。由Prim算法性质可知,w(ed2) >= w(ed1)。

  此时,在 Tmin 中删除 ed2 ,添加 ed1,边的数量和顶点数量均不变,且不存在环,因此得到新的生成树Tnew,且cost(Tmin)>=cost              (Tnew)。又因为 Tmin 是MST 所以 cost(Tmin)=cost(Tnew)。

 

发表评论

0/200
267 点赞
0 评论
收藏