1. 程式人生 > >最小生成樹-Prim算法和Kruskal算法

最小生成樹-Prim算法和Kruskal算法

圖論 img height 高亮 lin 開始 a算法 能夠 步驟

Prim算法

1.概覽

普裏姆算法Prim 算法),圖論中的一種算法,可在加權連通圖裏搜索最小生成樹。意即由此算法搜索到的邊子集所構成的樹中,不但包括了連通圖裏的所有頂點 英語 Vertex (graph theory) ) ,且其所有邊的權值之和亦為最小。該算法於1930年由捷克數學家沃伊捷赫·亞爾尼克 英語 Vojtěch Jarník ) 發現;並在1957年由美國計算機科學家羅伯特·普裏姆 英語 Robert C. Prim ) 獨立發現;1959年,艾茲格·迪科斯徹再次發現了該算法。因此,在某些場合,普裏姆算法又被稱為DJP算法、亞爾尼克算法或普裏姆-亞爾尼克算法。

2.算法簡單描述

1).輸入:一個加權連通圖,其中頂點集合為V,邊集合為E;

2).初始化:Vnew = {x},其中x為集合V中的任一節點(起始點),Enew = {},為空;

3).重復下列操作,直到Vnew = V:

a.在集合E中選取權值最小的邊<u, v>,其中u為集合Vnew 中的元素,而v不在Vnew 集合當中,並且v∈V(如果存在有多條滿足前述條件即具有相同權值的邊,則可任意選取其中之一);

b.將v加入集合Vnew 中,將<u, v>邊加入集合Enew 中;

4).輸出:使用集合Vnew 和Enew 來描述所得到的最小生成樹。

下面對算法的圖例描述

圖例說明不可選可選已選(Vnew

技術分享

此為原始的加權連通圖。每條邊一側的數字代表其權值。 - - -

技術分享

頂點D 被任意選為起始點。頂點ABEF 通過單條邊與D 相連。A 是距離D 最近的頂點,因此將A 及對應邊AD 以高亮表示。 C, G A, B, E, F D

技術分享

下一個頂點為距離DA 最近的頂點。BD 為9,距A 為7,E 為15,F 為6。因此,FDA 最近,因此將頂點F 與相應邊DF 以高亮表示。 C, G B, E, F A, D
技術分享 算法繼續重復上面的步驟。距離A 為7的頂點B 被高亮表示。 C B, E, G A, D, F

技術分享

在當前情況下,可以在CEG 間進行選擇。CB 為8,EB 為7,GF 為11。E 最近,因此將頂點E 與相應邊BE 高亮表示。 C, E, G A, D, F, B

技術分享

這裏,可供選擇的頂點只有CGCE 為5,GE 為9,故選取C ,並與邊EC 一同高亮表示。 C, G A, D, F, B, E

技術分享

頂點G 是唯一剩下的頂點,它距F 為11,距E 為9,E 最近,故高亮表示G 及相應邊EG G A, D, F, B, E, C

技術分享

現在,所有頂點均已被選取,圖中綠色部分即為連通圖的最小生成樹。在此例中,最小生成樹的權值之和為39。 A, D, F, B, E, C, G

3.簡單證明prim算法

反證法:假設prim生成的不是最小生成樹

1).設prim生成的樹為G0

2).假設存在Gmin 使得cost(Gmin )<cost(G0 ) 則在Gmin 中存在<u,v>不屬於G0

3).將<u,v>加入G0 中可得一個環,且<u,v>不是該環的最長邊(這是因為<u,v>∈Gmin )

4).這與prim每次生成最短邊矛盾

5).故假設不成立,命題得證.

5.時間復雜度

這裏記頂點數v,邊數e

鄰接矩陣:O(v2 ) 鄰接表:O(elog2 v)

Kruskal算法

1.概覽

Kruskal算法 是一種用來尋找最小生成樹的算法,由Joseph Kruskal在1956年發表。用來解決同樣問題的還有Prim算法和Boruvka算法等。三種算法都是貪婪算法的應用。和Boruvka算法不同的地方是,Kruskal算法在圖中存在相同權值的邊時也有效。

2.算法簡單描述

1).記Graph中有v個頂點,e個邊

2).新建圖Graphnew ,Graphnew 中擁有原圖中相同的e個頂點,但沒有邊

3).將原圖Graph中所有e個邊按權值從小到大排序

4).循環:從權值最小的邊開始遍歷每條邊 直至圖Graph中所有的節點都在同一個連通分量中

if 這條邊連接的兩個節點於圖Graphnew 中不在同一個連通分量中

添加這條邊到圖Graphnew

圖例描述:

技術分享首先第一步,我們有一張圖Graph,有若幹點和邊

技術分享將所有的邊的長度排序,用排序的結果作為我們選擇邊的依據。這裏再次體現了貪心算法的思想。資源排序,對局部最優的資源進行選擇,排序完成後,我們率先選擇了邊AD。這樣我們的圖就變成了右圖

技術分享在剩下的變中尋找。我們找到了CE。這裏邊的權重也是5

技術分享依次類推我們找到了6,7,7,即DF,AB,BE。

技術分享下面繼續選擇, BC或者EF盡管現在長度為8的邊是最小的未選擇的邊。但是現在他們已經連通了(對於BC可以通過CE,EB來連接,類似的EF可以通過EB,BA,AD,DF來接連)。所以不需要選擇他們。類似的BD也已經連通了(這裏上圖的連通線用紅色表示了)。

最後就剩下EG和FG了。當然我們選擇了EG。最後成功的圖就是右:

3.簡單證明Kruskal算法

對圖的頂點數n做歸納,證明Kruskal算法對任意n階圖適用。

歸納基礎:

n=1,顯然能夠找到最小生成樹。

歸納過程:

假設Kruskal算法對n≤k階圖適用,那麽,在k+1階圖G中,我們把最短邊的兩個端點a和b做一個合並操作,即把u與v合為一個點v‘,把原來接在u和v的邊都接到v‘上去,這樣就能夠得到一個k階圖G‘(u,v的合並是k+1少一條邊),G‘最小生成樹T‘可以用Kruskal算法得到。

我們證明T‘+{<u,v>}是G的最小生成樹。

用反證法,如果T‘+{<u,v>}不是最小生成樹,最小生成樹是T,即W(T)<W(T‘+{<u,v>}) 。顯然T應該包含<u,v>,否則,可以用<u,v>加入到T中,形成一個環,刪除環上原有的任意一條邊,形成一棵更小權值的生成樹。而T-{<u,v>},是G‘的生成樹。所以W(T-{<u,v>})<=W(T‘) ,也就是W(T)<=W(T‘)+W(<u,v>)=W(T‘+{<u,v>}), 產生了矛盾。於是假設不成立,T‘+{<u,v>}是G的最小生成樹,Kruskal算法對k+1階圖也適用。

由數學歸納法,Kruskal算法得證。

時間復雜度:elog2 e e為圖中的邊數。

最小生成樹-Prim算法和Kruskal算法