前幾天研究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語言實現 **如下
1234567
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...