Kruskal算法正确性证明

Kruskal算法:

  步骤1,选择边e1,使得权值w(e1)尽可能小;

  步骤2,若已选定边e1,e2,...,ei,则从E\{e1,e2,...,ei}选取e(i+1),使得

    (1)G[{e1,e2,...,e(i+1)}]为无圈图

    (2)权值w(e(i+1))是满足(1)的尽可能小的权;

  步骤3,当步骤2不能继续执行时停止。

 

证明:由Kruskal算法构成的任何生成树T*=G[{e1,e2,...,e(n-1)}]都是最下生成树,这里n为赋权图G的顶点数。(个人理解:因为局部最优,取尽可能小的权,不代表全局最小,因此正确性还是要证明的吧)

使用反证法,1、有kruskal算法构成的生成树T*和异于T*的生成树T,这两种生成树。

      2、定义函数f(T)表示不在T中的最小权值i的边ei。假设T*不是最小树,T真正的最小树,显然T会使f(T)尽可能大的,即T本身权重则会尽可能小,。

      3、设f(T)=k,表示存在一个不在T中的最小权值边ek=k,也就是说e1,e2,...e(k-1)同时在T和T*中,ek=k不在T中

      4、T+ek包含唯一圈C。设ek ' 是C的一条边,他在T中而不在T*中。(想象圈C中至少有ek 和ek ' ,其中ek是又Kruskal算法得出的最小权边) 

      5、令T ' =W(T)+w(ei)-w(ei ' ),kruskal算法选出的是最小权边ek,(而ek'是T自己根据f(T)选出来的边)有w(ek ' )>=w(ek) 且W(T ' )=W(T*)(T ' 也是一个最小生成树)

      6、但是f(T ' )>k= f(T),即T没有做到使得f(T)尽可能大,不再是真正的最小树,所以T=T*,从而T*确实是一棵最小数。

 

posted @   SsoZh  阅读(3808)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示