/**
prim算法應該是我學會的第一個圖算法
最小生成樹,一個無向圖使每兩個點都連通的最小花費,每條邊都會有
邊權,這個算法在點少邊多的情況下要比kruskal 更有優勢,一般都不多於
1000個點。
比如:幾個村莊鋪設電話線,給出了一個圖,圖上描述了每兩個村莊進行連接的花費,
現在求一種最小花費使每兩個村莊有且僅有一條路徑相連。
還是那句話,圖算法現成模板太多,關鍵在於把問題轉換成這個模型
在裏面標記,可得到最小生成樹的形狀,不只是最小權
有向圖的最小生成樹叫最小樹形圖,我空間裏面有,在前面,比這個複雜點
*/
int map[Max][Max]; // map = inf; 初始化爲正無窮大
int n; //點的個數
int prim() {
int dis[Max], count = n-1, i, min_edge, min_node;
for (i=1; i<=n; i++)
dis[i] = inf;
int now = s; //設s 爲起點隨便找個 (1 - n)
int ans = 0;
while (count--) {
dis[now] = -1;
min_edge = inf;
for (i=1; i<=n; i++) {
if (now!=i && dis[i] >= 0) {
dis[i] = min(dis[i], map[now][i]);
if (dis[i] < min_edge) {
min_edge = dis[i];
min_node = i;
}
}
}
now = min_node;
ans += min_edge;
}
return ans;
}
int main() {
//建好圖 後直接調用
prim();
return 0;
}
收藏於 2012-01-08
來自於百度空間
最小生成樹 prim()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.