對於給定的乙個無向圖與權值,如何求他的最小生成樹呢?乙個比較經典的做法是prim演算法。
主要思路是,首先定義個鄰接矩陣,裡面儲存著每條無向邊的權值,如果兩個點間沒有通路,則定義為int_max。再定義個最小邊矩陣,儲存未連線的點跟已連線點的最短距離。還要定義乙個矩陣,用來標識點是否已經被加入到生成樹當中。
接著決定乙個點作為起點,並把最小邊矩陣更新為每個點到選定點的距離。然後遍歷一遍,找出最小邊矩陣中最小的邊,將那個所連線的點加入到生成樹當中,將這個點記為p。同時更新最小邊矩陣,更新方法為:
對於每乙個不在生成樹的點,如果它到p的距離小於最小邊矩陣的值,就更新。否則保持原來的值。
舉個例子,有以下無向圖,將1作為起點
則可以得到最小邊矩陣
可以看到最小的是3這個邊,將3加入最小生成樹中,並更新矩陣。
此時最小的是連線4的這個邊,將4加入樹中,繼續更新矩陣。
最後把2加入樹中,就得到了最小生成樹。
c++**如下:
#include
using
namespace std;
//假設輸入的點個數在500以內
int dis[
510]
[510];
int vis[
510]
;int min_dis[
510]
;int
main()
}while
(m--
)//首先把1加入生成樹中
vis[1]
=1;//第一次更新最小邊矩陣
for(
int i =
2; i <= n; i++
)//用來標識是否找到乙個點,防止因為所有點不在乙個圖內而多做動作
bool flag =
true
;//for (int i = 0; i <= n; i++)cout << dis[1][i] << endl;
for(
int i =
2; i <= n; i++)}
if(flag)}}
else
}for
(int i =
2; i <= n; i++)}
cout << ans << endl;
return0;
}
最小生成樹與Prim演算法
首先是一棵樹 廢話 其次沒有迴路 廢話 包含全部頂點和v 1條邊 邊的權重和最小!所以如果是單棵最小生成樹,至少說明圖是連通的。不然就是森林。既然是根據圖生成樹,那麼至少要有遍歷圖。那麼,便要從乙個源點出發,來一場愉快的深搜或廣搜。深搜生成就叫dfs樹 深度優先搜尋樹 廣搜生成就叫bfs樹 廣度優先...
最小生成樹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中找一條最小權值的邊,加入生成樹...