最小生成樹Prim演算法的理解

2021-08-13 22:20:05 字數 1884 閱讀 4022

1,原文引述

任意給定帶權圖n = ,演算法始終將頂點集合分成不重疊的兩部分, v = v1 u (v - v1),也就是該圖的乙個割(cut)。其中v1是生成樹的頂點集合,(v - v1)是圖中不在生成樹內頂點的集合。這裡只考慮連通的網路(連通圖),所以只要v1與(v-v1)均非空,他們之間就至少有一條邊相連,稱這種邊為該割的一座橋(bridge)。每一輪迭代中都要在當前割的所有橋中,挑選出權值最小者(u,v),u屬於v1,v屬於(v-v1),然後將頂點v加入到生成樹的頂點集合當中,即令v1 = v1 u ;將邊(u,v)加入到生成樹的邊集合e1中,即e1 = e1 u(u,v)。(注意:若最短橋有多座,又該怎麼處理?),這一過程不斷重複,每經過一輪迭代,v1中都會增加乙個頂點,e1中都會增加一條邊。當v1中含有n個頂點,e1中含有n-1條邊時,演算法終止。此時(v1,e1)就給出n的一棵最小生成樹。

2,上面用離散數學中圖的概念對prim演算法在理論上做了闡述,其實在對圖的概念有了理解之後,上面的敘述還是十分明晰易懂的。最重要的就是上述定義中的黑體字部分:

(1)頂點將始終將圖分出兩部分,即有兩個不同但又互補的頂點集合——已經選入最小生成樹中的點和未被選入的點。(點割集概念)

(2)因為是連通圖,所以這兩個點集之間一定至少有一條邊將兩個點集連通,這個邊的乙個端點屬於v1另乙個端點屬於(v-v1)。(橋的概念)

3,prim演算法「取點」與「砍邊」的過程

上面的每條不同顏色的線代表每次對v1與(v-v1)兩個點集的重新劃分,每條線的標號(1,2,3,4,5,6)表示先後順序。

1》第乙個選入的點是0號,那麼0號點與1,2,3,4,5,6號點就分屬於兩個集合v1和(v-v1),這也表明0號點已經是最小生成樹中的點了。而第一條線(圖中紅色線)便把0號節點與1,2,3,4,5,6號節點分割開,這個時候紅線經過了兩條節之間的邊(權值分別是10與28),其實這兩條邊就是兩個點集之間的橋。我們希望最後的權值之和最小,當然就選擇了權值為10(10 小於28)的邊,這時候5號節點自然被選入進來。

2》上面這個過程結束後,0號節點與5號節點屬於v1,而其他的仍屬於(v-v1)。那麼我們再畫一條線(圖中黃色線)將這兩個點集合區分。這時黃線又經過了權值是28、25的橋,這次繼續選最小的25,自然4號節點又被分割過來。

3》繼續畫線,繼續分割,繼續找權值較小的橋,……

4》最後所有的頂點都被選進最小生成樹的頂點集當中,當然在割點的過程中我們也選擇了一系列權值較小的邊,這些邊便構成了最小生成樹的邊集合。

5》下面是每用線分割一次所形成的點割集。

1,原文引述:與kruskal演算法類似,需要乙個最小堆儲存圖的邊,每次選出乙個端點在生成樹中,另乙個端點不在生成樹的權值最小的邊(u,v),他正好在最小堆的堆頂,將其從堆中退出,加入生成樹中。然後將新出現的所有乙個端點在生成樹中乙個端點不在生成樹的邊都插入最小堆當中(自:就是劃線線與選線的過程)。下一輪迭代中,下一條滿足要求的權值最小的又上公升到最小堆的堆頂。如此重複n-1次,最後建立其該圖的最小生成樹。

2,有關的**實現可以參考相應的教材《資料結構c++語言描述第二版》(殷人昆著),因為其涉及到最小堆**、圖的儲存**,所以**比較長,不再貼出。

在實現兩種演算法的過程中可以感受到,kruskal是在每次選最小的邊(邊割集),這樣當乙個圖結構的節點很多、邊較少的時候(稀疏圖),使用kruskal演算法更加高效。而prim演算法是在分割圖中的點(點割集),這樣當乙個圖點較少、邊很多的時候(稠密圖),使用prim演算法更加高效。

推薦博文:

最小生成樹Prim演算法理解

mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...

最小生成樹Prim演算法理解

mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...

最小生成樹Prim演算法理解

mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...