最小生成樹 Kruskal Prime演算法

2022-04-29 13:48:09 字數 1720 閱讀 7469

圖的存貯採用邊集陣列或鄰接矩陣,權值相等的邊在陣列中排列次序可任意,邊較多的不很實用,浪費時間,適合稀疏圖。

方法

:將圖中邊按其權值由小到大的次序順序選取,若選邊後不形成迴路,則保留作為一條邊,若形成迴路則除去.依次選夠(n-1)條邊,即得最小生成樹.(n為頂點數)。

kruskal演算法在圖g=(v,e)上的執行時間取決於分離集合這一資料結構如何實現。採用在分離集合中描述的按行結合和通路壓縮的啟發式方法來實現分離集合森林的結構,這是從漸近意義上說,目前最快實現法。初始化占用時間o(v),對邊排序需時間為o(e㏒e);對分離集的森林要進行o(e)次操作,共需時間為o(ef(e,v)),其中f函式為ackerman函式的反函式。因f(e,v)=o(㏒e),所以kruskai

全部執行時間為

/*********************kruskal演算法********************/2

void init_kruskal_mst(void)3

//注意呼叫方法910

void kruskal_mst(void)11

29 cn++; //

注意位置30}

31 }

方法:從指定頂點開始將它加入集合中,然後將集合內的頂點與集合外的頂點所構成的所有邊中選取權值最小的一條邊作為生成樹的邊,並將集合外的那個頂點加入到集合中,表示該頂點已連通.如此下去直到全部頂點都加入到集合中,即得最小生成樹.

①    置頂點集合v和邊集e,它們的初始狀態為空集。

②    任意選取乙個頂點a加入v中。 

③    復以下過程直到v中已經包含原圖的所有節點: 

1、選一條權值最小的邊(u,v),並使其滿足u,v兩節點只有乙個在點集v中。

2、將兩個節點中不在v的那個點加入集合v中,並將邊(u,v)加入邊集e中。

④    所得的子圖g』=(v,e)即為所求的最小生成樹。

任意時刻的中間結果都是一棵樹,每次花費最小的代價,用一條邊把不在樹中的結點加進來。按結點來貪,因此適用於稠密圖的處理. 關鍵:找出當前最優得一條邊,窮舉每一條不在集合e中的邊,找出符合條件且最優的邊。鄰接矩陣:o(v2) 。

1

void init_prime_mst(void)2

12 count=1; //

預設第乙個節點[編號0]已選【可以更改】

13 vis[start]=1

;14 min_from[start]=start;15}

1617

void prime_mst(void)18

3132

if(to_index != -1) //

找到終點

3343

else

44break;45

46for(int j=0;jn;j++) //

更新dist,使不在生成樹上的點到生成樹上的點的距離最小,直到所有的點都在生成樹上。

47if(!vis[j] && (min_wg[j] > mg->edge[to_index][j]))

4852

}53 }

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...