1. 程式人生 > >Kruskal演算法正確性證明

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*確實是一棵最小數。