kruskal演算法 最小生成樹2

2022-06-03 09:06:07 字數 2025 閱讀 1353

設g=(v,e)是無向連通帶權圖,v=;

設最小生成樹t=(v,te),該樹的初始狀態為只有n個頂點而無邊的非連通圖t=(v,{}),kruskal演算法將這n個頂點看成是n個孤立的連通分支。

它首先將所有的邊按權值從小到大排序,然後只要t中選中的邊數不到n-1,就做如下的貪心選擇:

在邊集e中選取權值最小的邊(i,j),如果將邊(i,j)加入集合te中不產生迴路(圈),則將邊(i,j)加入邊集te中,即用邊(i,j)將這兩個連通分支合併連線成乙個連通分支;

否則繼續選擇下一條最短邊。把邊(i,j)從集合e中刪去。

繼續上面的貪心選擇,直到t中所有頂點都在同乙個連通分支上為止。

此時,選取到的n-1條邊恰好構成g的一棵最小生成樹t。

那麼,怎樣判斷加入某條邊後圖t會不會出現迴路呢?

該演算法對於手工計算十分方便,因為用肉眼可以很容易看到挑選哪些邊能夠避免構成迴路(避圈法),但使用電腦程式來實現時,還需要一種機制來進行判斷。

kruskal演算法用了乙個非常聰明的方法,就是運用集合避圈:

如果所選擇加入的邊的起點和終點都在t的集合中,那麼就可以斷定一定會形成迴路(圈)。其實就是我們前面提到的「避圈法」:邊的兩個結點不能屬於同一集合。

步驟1:初始化。將圖g的邊集e中的所有邊按權值從小到大排序,邊集te={},把每個頂點都初始化為乙個孤立的分支,即乙個頂點對應乙個集合。

步驟2:在e中尋找權值最小的邊(i,j)。

步驟3:如果頂點i和位於兩個不同連通分支,則將邊(i,j)加入邊集te,並執行合併操作,將兩個連通分支進行合併【即兩個頂點設定成同乙個集合號,一般向小集合號合併】。

步驟4:將邊(i,j)從集合e中刪去,即e=e-。

步驟5:如果選取邊數小於n-1,轉步驟2;否則,演算法結束,生成最小生成樹了。

適用範圍:要求無向圖

kruskal演算法(讀者可以將其讀作「克魯斯卡爾演算法」同樣是解決最小生成樹問題的乙個演算法。和prim演算法不同,kruskal演算法採用了邊貪心的策略,其思想極其簡潔,理解難度比prim演算法要低很多。

kruskal演算法的基本思想為:在初始狀態時隱去圖中的所有邊,這樣圖中每個頂點都自成乙個連通塊。

之後執行下面的步驟:

①對所有邊按邊權從小到大進行排序。

②按邊權從小到大測試所有邊,如果當前測試邊所連線的兩個頂點不在同乙個連通塊中,則把這條測試邊加入當前最小生成樹中;否則,將邊捨棄。

③執行步驟②,直到最小生成樹中的邊數等於總頂點數減1或是測試完所有邊時結束。

而當結束時如果最小生成樹的邊數小於總頂點數減1,說明該圖不連通。

接下來以圖10-51a為例,給出對該圖執行kruskal演算法的步驟。

①當前圖中邊權最小的邊為v。v,權值為1。由於vo和v4在不同的連通塊中,因此把邊vova加入最小生成樹中,此時最小生成樹中有1條邊,權值之和為1,如圖10-51所示。

因此,kruskal演算法的思想簡單說來就是:

每次選擇圖中最小邊權的邊,如果邊兩端的頂點在不同的連通塊中,就把這條邊加入最小生成樹中。

1

//邊集定義部分

2struct

edge

3e[maxe];//

最多有maxe條邊78

bool

cmp(edge a,edge b)912

13//

並查集部分

14int father[maxv];//

並查集陣列

15int findfather(int

x)16

27return

x;28}29

30//

kruskal部分,返回最小生成樹的邊權之和,引數n為頂點個數,m為圖的邊數

31int kruskal(int n,int

m)32 49}

50if(num_edge!=n-1)51

return -1;//

無法連通時返回-1

52else

53return ans;//

返回最小生成樹的邊權之和

54 }

最小生成樹 kruskal(演算法)

最小生成樹 圖中有好多點呀 n個 讓我們找到n 1條邊,來把他們連上吧,但是要讓這n 1條邊的和最小。kruskal演算法 把所有邊由公升序排列,然後從最小的一條邊找起,如果這條邊的兩點不屬於乙個集合 此處運用並查集 那麼就要這條邊,否則,忽略這條邊吧 一直這樣找下去,直到找了n 1條邊為止,此時,...

最小生成樹 Kruskal演算法

1.概覽 kruskal演算法是一種用來尋找最小生成樹的演算法,由joseph kruskal在1956年發表。用來解決同樣問題的還有prim演算法和boruvka演算法等。三種演算法都是貪婪演算法的應用。和boruvka演算法不同的地方是,kruskal演算法在圖中存在相同權值的邊時也有效。2.演...

最小生成樹 kruskal演算法

2016.12.30 演算法思想 先將邊按照權值排序,從權值最小的邊開始列舉,如果當前邊連線的兩個點不屬於同一集合,就將這兩個點連起來 用到的資料結構是並查集 一直到列舉完所有的邊,此時生成的就是最小生成樹 include include include include using namespac...