Kruskal算法思想:
把n個頂點看成看成n棵分離的樹(每棵樹只有一個頂點),每次選取可連接兩個分離樹中權值最小的邊把兩個分離的樹合成一個新的樹取代原來的兩個分離樹,如果重復n-1步后便得到最小生成樹。
Kruskal算法步驟:
T0存放生成樹的邊,初值為空
C(T0) 最小生成樹的權,初值為0
VS 分離樹頂點的集合,初值為 { {v1} {v2} … {vn} }
A B W分別為邊的頂點和權值數組,由用戶輸入
1) T0←0, C(T0)←0, VS←{ {v1} {v2} … {vn} }, A, B, W按W排序后構成隊列Q
2) If n(VS)==1 then stop else goto 3
3) 取Q第一組數組(u, v, w) 並從Q中將其刪除.
4) If u, v 屬於同一個集合 then goto 3 else 分屬兩個集合X, Y, goto 5.
5) T0←T0∪(u, v), C(T0)←C(T0)+w, VS←VS-X-Y+X∪Y goto 2.
Kruskal算法證明:
樹定義:無圈連通圖。
引理1:一個圖是樹 等價於 一個圖無圈且任意不相關聯的頂點u, v ,圖G+(u, v)則必存在唯一一個圈。
設由Kruskal算法生成的T0序列為e1, e2, e3 … ev-1,假設其不是最小生成樹。任意最小生成樹T定義函數f(T):T0中不存在於T中邊在T0的下標。設T1是使f(T)最大的變量,設f(T1)=k,即ek不存在於T1中,T1為樹且ek不在T1中,所以由引理1得T1+ek必存在圈C,C上必有e,k ≠ek,e,k不在T0 中。現令T2 = T1 - e,k + ek,則T2也為生成樹但由Kruskal算法可知ek是使e1, e2 … ek-1, ek無圈的權值最小的邊,e1, e2 … ek-1, e,k是樹的子圖必無圈故e,k的權值必定小於ek,即T2的總權值不大於T1的權值,因T1是最小生成樹,故必T2也是最小生成樹,但f(T2)>k與k是f函數最大取值矛盾,故T0是最小生成樹。