大話資料結構 (六)最小生成樹

2021-10-04 14:09:43 字數 1515 閱讀 7752

我們在講圖的定義和術語時,曾經提到過,乙個連通圖的生成樹是乙個極小的連通子圖,它含有圖中全部的頂點,但只有足以構成一棵樹的n-1條邊。那麼我們把構造連通網的最小代價生成樹稱為最小生成樹。在了解最小生成樹的概念之後,我們更應該看重的是如何獲取最小生成樹,並如何利用最小生成樹來解決問題。

在給出prim演算法**之前,我們先來演示乙個例項,看看普利姆演算法是如何一步步獲取最小生成樹的,如圖1所示。

主要思想,在當前可選路中選出最短的那條路。我們的目的是在不成環的前提下,連通所有結點,而不是一步遍歷所有結點,所以當我們獲取下一條路徑時,我們的出發點可以是已走路徑上的任意一點,下面給出最小生成樹的生成步驟。

//普利姆演算法生成最小生成樹

void

minispantree_prim

(mgraph g)

for(i=

1;i) j++;}

cout<

<<

","<

//列印當前頂點邊中權值最小邊

lowcost[k]=0

;//將當前頂點的權值設定為0,表示此頂點已經完成任務

for(j=

1;j}}

現在我們來換一種思考方式,普利姆演算法是以某頂點為起點,逐步找頂點上最小權值的邊來構建最小生成樹的。而克魯斯卡爾演算法直接以邊為目標去構建,因為權值是在邊上,直接去找最小權值的邊構建生成樹也是很自然的想法,只不過構建時要考慮是否形成環路而已。此時我們就用到了圖的儲存結構中的邊集陣列結構。以下是edge邊集陣列結構的定義**:

//對邊集陣列edge結構的定義

typedef

struct

edge;

我們將圖2轉化為圖3的邊集陣列,並且對它們按權值從小到大排序。

//kruskal演算法生成最小生成樹

void

minispantree_kruskal

(mgraph g)

//生成最小生成樹

for(i=

0;i;i++)}

}int

find

(int

*parent,

int f)

//查詢連線頂點的尾部下標

對比兩個演算法,克魯斯卡爾演算法主要是針對邊來展開,邊數少時效率會非常高,所以對於稀疏圖有很大的優勢;而普利姆演算法對於稠密圖,即邊數非常多的情況會更好一些。

《大話資料結構》最小生成樹 Kruskal演算法

2014 6 24 思想 n個節點的圖中,只需要找到權值最小且不與現有邊集合構成環的 n 1 條邊,必成最小生成樹。方案 將邊的權值進行篩選,每次找到權值最小的邊,補充道邊集合中即可。難點 如何確保這些邊不構成環 對每個邊,讓其起始節點是祖先,通過洄游尋根,如果祖先相同說明兩個節點是 近親 會構成閉...

資料結構 最小生成樹

生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...

資料結構(最小生成樹)

對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...