最小生成樹Prim演算法樸素版 C語言實現

2021-05-04 09:42:47 字數 2598 閱讀 7508

前幾天研究kruskal演算法,直接上手就是並查集優化,樸素演算法壓根就沒寫。這兩天看prim演算法也想略過樸素版o(n^2)直接用二叉堆優化,可是發現不看樸素演算法根本寫不出來...囧,看來還是不能忽略基礎...

草稿紙上畫圖模擬推演了半天,終於搞清楚prim演算法樸素版的c語言實現,拿出那天學kruskal的小題目測試了一下,通過。

**的注釋我寫得很詳細,方便理解,有幾點需要說明一下。

1、2個for迴圈都是從2開始的,因為一般我們預設開始就把第乙個節點加入生成樹,因此之後不需要再次尋找它。

2、lowcost[i]記錄的是以節點i為終點的最小邊權值。初始化時因為預設把第乙個節點加入生成樹,因此lowcost[i] = graph[1][i],即最小邊權值就是各節點到1號節點的邊權值。

3、mst[i]記錄的是lowcost[i]對應的起點,這樣有起點,有終點,即可唯一確定一條邊了。初始化時mst[i] = 1,即每條邊都是從1號節點出發。

編寫程式:對於如下乙個帶權無向圖,給出節點個數以及所有邊權值,用prim演算法求最小生成樹。

輸入資料:

7 11

a b 7

a d 5

b c 8

b d 9

b e 7

c e 5

d e 15

d f 6

e f 8

e g 9

f g 11

輸出:a - d : 5

d - f : 6

a - b : 7

b - e : 7

e - c : 5

e - g : 9

total:39

最小生成樹prim演算法樸素版 c語言實現 **如下

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

9697

9899

100101

102103

104105

106107

108109

110111

112113

#include 

#include

#define max 100

#define maxcost 0x7fffffff

int graph[max]

[max]

;int prim(

int graph[

][max]

,int n)

/* 標記1號節點加入生成樹 */

mst[1]

=0;/* n個節點至少需要n-1條邊構成最小生成樹 */

for(i =

2; i <= n; i++)}

/* 輸出生成樹邊的資訊:起點,終點,權值 */

printf

("%c - %c : %d/n"

, mst[minid]

+'a'-1

, minid +

'a'-

1, min)

;/* 累加權值 */

sum += min;

/* 標記節點minid加入生成樹 */

lowcost[minid]=0

;/* 更新當前節點minid到其他節點的權值 */

for(j =

2; j <= n; j++)}

}/* 返回最小權值和 */

return sum;

}int main()}

/* 讀取邊資訊 */

for(k =

0; k < n; k++

)/* 求解最小生成樹 */

cost = prim(graph, m)

;/* 輸出最小權值和 */

printf

("total:%d/n"

, cost)

;//system("pause");

return0;

}

最小生成樹prim演算法C

以前也寫過,這次看 決定寫一下.總不寫東西的話,腦袋就笨笨了.用到的東西都在前面的圖實現裡.要說啊,不久之後,用stl dll寫出來,呵呵.加油吧.graph.cpp 2011 08 28 21.20 include stdafx.h include graphrepresentasadjacent...

最小生成樹(prim演算法)

最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...

最小生成樹 Prim演算法

prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...