看導論看不下去了,偽**有點粗糙啊,導論上面提到的是最優的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 ...