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

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的选择方式一定是正确的

以上是关于prim算法和kruskal算法的简洁证明的主要内容,如果未能解决你的问题,请参考以下文章

Prim算法和Kruskal算法(图论中的最小生成树算法)

贪心算法之prim算法的证明

最小生成树之Kruskal算法和Prim算法

prim算法和kruskal算法(C语言)

最小生成树-Prim算法和Kruskal算法

图论最小生成树Prim和Kruskal算法