C 簡單演算法 Prim與最小生成樹

2021-10-24 17:21:36 字數 1526 閱讀 3210

對於給定的乙個無向圖與權值,如何求他的最小生成樹呢?乙個比較經典的做法是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中找一條最小權值的邊,加入生成樹...