最小產生樹演算法(prim&kruskal)

來源:互聯網
上載者:User

無向連通圖 G = (V, E)的產生樹是它的極小連通子圖:串連了圖中所有的頂點,有保持圖連通的最少的邊,且不包含迴路(最少的邊這一條件已經隱含了不含迴路的性質,同時,產生樹是一種樹,也是不允許有迴路的)。在所有的產生樹中,權值最小的樹就是最小產生樹(minimum spanning tree)。由最小產生樹的性質可知,它的邊數比頂點數小一,而且一個圖的最小產生樹往往是不唯一的。

求解無向連通圖的最小產生樹的經典方法有兩種:kruskal演算法和prim演算法。兩個演算法都是貪心思想的應用:一次產生一條安全邊:

GENERIC_MST(G,W)

A← 空集

While A does not form a spanning tree

Do find an edge(u, v) thia is safe for A

A ← A  (u, v)

return A

說明一下安全邊的概念。無向聯通圖 G = (V, E)的一個割(S,V-S)是對V的一個劃分。如果邊(u,v)E的一個頂點屬於S,另一個屬於V-S,則稱(u,v)通過割(S,V-S)。如果邊的集合A中沒有邊通過某個割,則稱該割不妨害A。如果某條邊的權值是通過某個割的權值最小的邊,則稱該邊為通過這個割的一條輕邊。下面給出識別安全邊的規則:

設圖G=(V,E)為無向連通圖,設A為E的子集,包含於G德某個最小產生樹中,設割(S,V-S)是G的任意一個不妨害A的割,如果(u,v)是通過割(S,V-S)的一條輕邊,那麼(u,v)對集合A來說是安全的。

Kruskal演算法:

初始狀態下產生樹A是空集,每個頂點都是一棵樹(一個連通分支),然後每次都將圖中串連兩個不同的連通分支的最小權邊加入到A中,然後合并兩個兩個連通分支,直到圖中的所有頂點都屬於同一個連通分支。

演算法的描述挺簡單,但是有兩個問題需要解決:

1.如何判斷兩個頂點是否屬於不同的連通分支?

《演算法導論》中關於該部分的論述使用了不相交集合資料結構。我在實現的時候使用一個標誌數組array,長度為|V|,依次對應圖中的每個頂點。array[i]、array[j]不同表示頂點i和頂點j屬於不同的連通分支,合併作業也很簡單,將array中和array[i]相同(表示位於同一連通分支)的元素值置為array[j],這樣就將頂點i所在的連通分支與j所在的分支合并。

2.如何找出屬於不同連通分支的最小權邊?

最直接的方法是遍曆圖中的所有邊,找出兩端處於不同的分支且權最小的邊。也可以使用排序演算法對邊按長度進行排序。

3.如何記錄產生樹?

  可以為每個頂點增加一個parent域,記錄在產生樹中它的父母。比如邊(u,v)添加到A中,那麼v的parent域就設為u。

Prim演算法:

初始狀態A包含任意一個頂點r,從r開始,每次都向A中添加一條串連樹A和G=(V,A)中某個孤立頂點的輕邊,直至產生樹A包含了圖中所有的頂點。

有效實現該演算法的關鍵是設法較容易地選擇一條輕邊。我們可以藉助最小優先順序隊列。

圖中的頂點可以分為兩類,一類是在A中的,已經納入最小產生樹了,另一種是不在A中的,記為B,對於這些頂點,我們需要儲存它們與A中的某個頂點相連的邊中的最小權值。最小優先順序隊列儲存的就是B(尚未納入最小產生樹)中的頂點以及它們與A中某個頂點相連的邊中的最小權值。   每次隊首出隊,設新加入A的頂點為V,那麼我們要修改V的鄰接點中尚未在A中(在最小優先順序隊列)的且與A中頂點相連的邊的最小權值(比較拗口)。另外,為了記錄產生樹,和Kruskal演算法一樣,我們需要增加parent域。

代碼地址:點擊開啟連結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.