最小生成樹 Prim和Kruskal

2022-06-06 22:03:09 字數 1474 閱讀 7515

首先這是圖的最小生成樹(加權圖)

在學習最小生成樹之前需要先明確幾個重要概念。

(1)連通圖:在無向圖中,若任意兩個頂點與都有路徑相通,則稱該無向圖為連通圖。

(2)強連通圖:在有向圖中,若任意兩個頂點與都有路徑相通,則稱該有向圖為強連通圖。

(3)連通網:在連通圖中,若圖的邊具有一定的意義,每一條邊都對應著乙個數,稱為權;權代表著連線連個頂點的代價,稱這種連通圖叫做連通網。

(4)生成樹:乙個連通圖的生成樹是指乙個連通子圖,它含有圖中全部n個頂點,但只有足以構成一棵樹的n-1條邊。一顆有n個頂點的生成樹有且僅有n-1條邊,如果生成樹中再新增一條邊,則必定成環。

(5)最小生成樹:在連通網的所有生成樹中,所有邊的代價和最小的生成樹,稱為最小生成樹。

最小生成樹,就是典型的貪心演算法

此演算法可以稱為「加點法」,每次迭代選擇代價最小的邊對應的點,加入到最小生成樹中。演算法從某個頂點s開始,逐漸長大覆蓋整個連通網的所有頂點。

有兩個頂點集

步驟:(1)圖的所有頂點集合為v

'>

v;初始令集合u=,

v=v−

u'>u=,v=v−u

=,v=v−u;

(2)在兩個集合u,v

'>u

,v能夠組成的邊中,選擇一條代價最小的邊(u0

,v0)

'>(u0,v0),

加入到最小生成樹中,並把v

0'>v

0併入到集合u中。

(3)重複上述步驟,直到最小生成樹有n-1條邊或者n個頂點為止。

此演算法可以稱為「加邊法」,初始最小生成樹邊數為0,每迭代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合裡。

1. 把圖中的所有邊按代價從小到大排序;

2. 把圖中的n個頂點看成獨立的n棵樹組成的森林;

3. 按權值從小到**擇邊,所選的邊連線的兩個頂點ui,

vi'>ui

,vi應屬於兩顆不同的樹,則成為最小生成樹的一條邊,並將這兩顆樹合併作為一顆樹。

4. 重複(3),直到所有頂點都在一顆樹內或者有n-1條邊為止。

參考:演算法導論--最小生成樹(kruskal和prim演算法)

資料結構與演算法——最小生成樹

Algorithm 最小生成樹之 Kruskal

個人觀點,較prime演算法,kurskal演算法更加的簡單,這裡我們只需要每一次去需找權值最小的那條邊就好,在這裡我們先可以利用sort進行快排,得到權值最小的map i 得到該條邊的兩個節點map i u 和map i v,這時候你需要判斷能不能用這條邊,因為最小生成樹是不能形成迴路,所以用到了...

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...