最小生成樹MST演算法(Prim Kruskal)

2022-10-09 02:06:07 字數 2362 閱讀 8696

(1)概念

乙個有 n 個結點的連通圖

的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊,所謂乙個帶權圖的最小生成樹,就是原圖中邊的權值最小的生成樹,所謂最小是指邊的權值之和小於或者等於其它生成樹的邊的權值之和。

(2)性質

(3)應用

例如:要在n個城市之間鋪設光纜,主要目標是要使這 n 個城市的任意兩個之間都可以通訊,但鋪設光纜的費用很高,且各個城市之間鋪設光纜的費用不同,因此另乙個目標是要使鋪設光纜的總費用最低。這就需要找到帶權的最小生成樹

prim演算法的流程

1)建立一組 mstset

,用於跟蹤 mst 中已包含的頂點。2)為輸入圖中的所有頂點分配乙個鍵值。將所有鍵值初始化為 infinite。為第乙個頂點分配鍵值為 0,以便首先選取它。3)雖然 mstset 不包括所有頂點....a)選擇乙個在 mstset

中不存在且具有最小鍵值的頂點 u

。....b)將 u

包含在 mstset 中。....c)更新 u

的所有相鄰頂點的鍵值。要更新鍵值,請迴圈訪問所有相鄰的頂點。對於每個相鄰的頂點 v

,如果邊 u-v

的權重小於 v

的前乙個鍵值,則將鍵值更新為 u-v

的權重使用鍵值的想法是從剪下

中選取最小權重邊。鍵值僅用於尚未包含在 mst 中的折點,這些折點的鍵值表示將它們連線到 mst 中包含的折點集的最小權重邊。

讓我們通過以下示例來理解:

設定的 mstset

最初是空的,分配給頂點的鍵是 ,其中 inf 表示無限。現在選取具有最小鍵值的頂點。選取頂點 0,將其包含在 mstset

中。因此,mstset

變得。包含到 mstset

後,更新相鄰頂點的鍵值。相鄰頂點 0 為 1 和 7。1 和 7 的鍵值將更新為 4 和 8。下圖顯示頂點及其鍵值,僅顯示具有有限鍵值的頂點。mst 中包含的頂點以綠色顯示。

選取具有最小鍵值且尚未包含在 mst 中(不在 mstset 中)的頂點。選取頂點 1 並將其新增到 mstset。所以 mstset 現在變成 。更新相鄰頂點 1 的鍵值。頂點 2 的鍵值變為 8。

選取具有最小鍵值且尚未包含在 mst 中(不在 mstset 中)的頂點。我們可以選擇頂點7或頂點2,讓頂點7被選中。所以 mstset 現在變成 。更新相鄰頂點 7 的鍵值。頂點 6 和 8 的鍵值變為有限(分別為 1 和 7)。

選取具有最小鍵值且尚未包含在 mst 中(不在 mstset 中)的頂點。選取頂點 6。所以 mstset 現在變成 。更新相鄰頂點 6 的鍵值。頂點 5 和 8 的鍵值將更新。

我們重複上述步驟,直到 mstset

包含給定圖形的所有頂點。最後,我們得到下圖。

prim演算法的實現(golang)

prim演算法的思想和dijkstra很相似,在理解dijkstra演算法的前提下,理解prim演算法及其實現都會變得非常容易

//graph 中值為math.maxint的值為不可達

func prim(graph int, randomvertex int) int

​//由於已經初始化乙個節點,所以只需便利n-1次

for i := 1; i < n; i++ }​

//標記到最短距離的節點為已訪問

visit[curidx] = true

//最短路徑值求和

res += minor

​//重新初始化已訪問節點到未訪問節點的距離

for j := 0; j < n; j++ }}

return res

}

堆優化版的prim算

最小生成樹(MST)

在帶權圖中,所有的生成樹中邊權的和最小的那棵 或幾棵 被稱為最小生成樹。幾點注意 求最小生成樹使用kruskal演算法。使用並查集處理節點的集合屬性,初始時所有結點屬於只包含其自身的孤立集合。實現 include include using namespace std define n 101 in...

最小生成樹 MST

1 prim演算法 對點進行貪心操作。適合稠密圖 const int m 1005 int vis m 表示該i點是否被選擇 vis i 0 還未被選擇 int map m m map i j 表示i到j的距離 int dis m 1到i的距離和 void prim cout sum 2 krusk...

最小生成樹MST

最小生成樹是在一張無向連通圖中,找到一棵樹,使得其邊的代價之和最小。注 可能存在多個最小生成樹。以邊為展開,將圖中的最小代價邊嘗試加入集合tree中,並且該邊不能與集合tree中的邊形成環,如此迭代,最終得到的集合tree為mst。因此可以採用並集查的方式實現kruskal演算法 以點為展開,將圖中...