最小生成樹 Prim

2021-08-19 00:19:19 字數 2669 閱讀 1261

看導論看不下去了,偽**有點粗糙啊,導論上面提到的是最優的prim演算法,在優先佇列處建議用的是堆,圖使用鍊錶儲存,都是為了最優的時間,但是自己才剛看明白大致思路,還是來個簡單的方法比較好,找到了一篇注釋詳細,一看就明白的部落格,自己實現了一遍,敲一下才能真正理解其中的奧妙

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

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

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

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

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

/* 標記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");

return

0;

}資料

輸入資料:711

a b 7

a d5

b c8

b d9

b e7ce

5de15

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

自己模仿的 –)<>(–
#include #define maxcost 30000

#define m 100

/** *g -> graphic n the number of vertex

*@return the sum of mst's weight

*/int prim(int g[m][m],int n)

mst[1] = 0;

//need n-1 edge

for(int i=2;i<=n;i++)

} // such j is always exsit

///print edge

printf("%d%d:%d\n",minindex,mst[minindex],lowist[minindex]);

sum+=lowist[minindex];

///present minindex is in mst

lowist[minindex] = 0;

mst[minindex] = 0;

//update lowist

for(int j=2;j<=n;j++)

int main()

}for(int i=1;i<=m;i++)

printf("%d\n",prim(g,n));

return

0;}

資料
輸入

7 11

1 2 7

1 4 5

2 3 8

2 4 9

2 5 7

3 5 5

4 5 15

4 6 6

5 6 8

5 7 9

6 7 11

輸出41:5

64:6

21:7

52:7

35:5

75:9

39

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...

最小生成樹 PRIM

這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...