Kruskal演算法的思想 證明及步驟

2021-09-06 05:05:31 字數 996 閱讀 8348

把n個頂點看成看成n棵分離的樹(每棵樹只有乙個頂點),每次選取可連線兩個分離樹中權值最小的邊把兩個分離的樹合成乙個新的樹取代原來的兩個分離樹,如果重複n-1步後便得到最小生成樹。

t0存放生成樹的邊,初值為空

c(t0)最小生成樹的權,初值為0

vs分離樹頂點的集合,初值為 … }

a b w分別為邊的頂點和權值陣列,由使用者輸入

1)         t0←0, c(t0)←0, vs← … }, 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演算法生成的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是最小生成樹。

Kruskal演算法的思想 證明及步驟

把n個頂點看成看成n棵分離的樹 每棵樹只有乙個頂點 每次選取可連線兩個分離樹中權值最小的邊把兩個分離的樹合成乙個新的樹取代原來的兩個分離樹,如果重複n 1步後便得到最小生成樹。t0存放生成樹的邊,初值為空 c t0 最小生成樹的權,初值為0 vs分離樹頂點的集合,初值為 a b w分別為邊的頂點和權...

Kruskal演算法的正確性證明

1 演算法說明 輸入圖g v,e,w v 輸出圖g的最小生成樹t 設計思想 按照長度從小到大對邊排序 依次考察當前最短邊e,如果e與t的邊不構成迴路,則把e加入樹t,否則跳過e直到選擇了n 1條邊為止。2 證明思路 命題 對於任意n,演算法對n階圖找到一棵最小生成樹 歸納基礎 證明n 2時演算法正確...

證明增廣路演算法的正確性及dinic演算法的使用

一直對增廣路這種貪心思想表示懷疑,今天看到乙個很好的證明。首先介紹割的概念,所謂圖的割,指的是某個頂點集合s屬於v,從s出發的所有邊的集合成為割 s,v s 這些邊的容量和被稱為割的容量,如果有源點s屬於s,匯點t屬於v s,則稱之為s t割,如果將s t割的所有邊都在原圖中去掉,則不再有s t的路...