prim算法和kruskal算法的简洁证明

本文是对网上资料的一些整合,附加了部分个人的理解,主要参考下面两篇博客

prim证明

Kruskal证明

prim树算法

算法流程

一开始任意选定一个点,然后在所有与选定点相邻的边中选出一条代价最小且另一端没有被选中的边加入生成树,然后反复迭代这个过程即可得到最小生成树.

正确性

设最小生成树为 G G G,使用 p r i m prim prim算法得到的生成树为 G ′ G' G

他们加入的边只有 x x x处不同,考虑 p r i m prim prim算法第一次遇到不同的边 e e e时, e e e连接 u , v u,v u,v

u u u所在连通块点集为 V V V(此前 p r i m prim prim算法生成的)

Ⅰ.在图 G G G中找出 u − > v u->v u>v的路径,路径上必然有一边 f f f满足一端所在点落在 V V V内,另一端不在

Ⅱ.而且根据 p r i m prim prim算法, e e e边的权值必然小于等于 f f f边(因为 e , f e,f e,f都和点集 V V V相邻,都能被选择,但最后 p r i m prim prim选择的是边 e e e)

Ⅲ.考虑在图 G G G去掉 f f f边,加入 e e e边,也能起到连通 V V V和另一端连通块的作用,而且代价不会变差

综上所诉,选择 e e e边后仍然存在最小生成树的解,而且此时必然满足 c o s t ( e ) = = c o s t ( f ) cost(e)==cost(f) cost(e)==cost(f).于是我们反复迭代这个过程,最后得到这 x x x条不同的边都可以加入最小生成树 G ′ G' G而不影响正确性

kruskal算法

算法流程

总是选出当前代价最小的边,满足这条边加入后不会成环

反复迭代就能得到最小生成树

正确性

考虑 k r u s k a l kruskal kruskal的第一步选出全局最小的边 e 1 e_1 e1

显然 e 1 e_1 e1一定在最小生成树中。如果不在,那我们把 e 1 e_1 e1加入到最小生成树会成环,环上任意一条边权值都大于 e 1 e_1 e1,显然删去任意一条边答案都会更优,与这是最小生成树矛盾

由此得到 e 1 e_1 e1必然在最小生成树中.随后把 e 1 e_1 e1连接的两点看成一个连通块(一个点),重复上述步骤,不难证明 k r u s k a l kruskal kruskal的选择方式一定是正确的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值