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*确实是一棵最小数。

猜你喜欢

转载自www.cnblogs.com/SsoZhNO-1/p/9938842.html