對於乙個無向連通圖,若是稠密圖的話:
儲存:鄰接矩陣g[n][n]來儲存圖,(n為圖最大的點的數量)
dist[n]儲存集合外的點到集合的最短距離,
s[n],即集合s,儲存集合的點,若s[i] == true,則該點在集合,否則不在。
演算法:設乙個s集合(圖的點的集合),初始時集合沒有點
步驟:1:從所有點中找距離s集合最近的點:t
2:將t加入這個集合
3:更新:集合外的點到集合的距離
結束標誌:所有點都進入s集合
**如下:
#include
#include
#include
using namespace std;
#define inf 0x3f3f3f3f
const
int n =
110;
int dist[n]
;int g[n]
[n];
int n, m;
//n為圖的點數,m為邊數
bool s[n]
;int
prim()
}if(i >
1&& dist[t]
== inf)
return inf;
//判斷圖是否連通,如果點距離集合所有其他點距離都為inf,則該圖為非連通圖(只有乙個點的圖可以認為是連通的)
if(i >
1) res +
= dist[t]
;//只有乙個點的圖,沒有邊
s[t]
= true;
//點進入集合s
for(
int j =
1; j <= n; j++
)//cout << "res=" << res << endl;
}return res;
}int
main()
int res =
prim()
;if(res == inf) cout <<
"impossible"
<< endl;
else cout << res << endl;
return0;
}
prim演算法構造最小生成樹
1.問題 假設g v,e 是連通的,te是g上最小生成樹中邊的集合。演算法從u u0 v te 開始。重複執行下列操作 在所有u u,v v u的邊 u,v e中找一條權值最小的邊 u0,v0 併入集合te中,同時v0併入u,直到v u為止。此時,te中必有n 1條邊,t v,te 為g的最小生成樹...
演算法 Prim演算法構造最小生成樹
基本概念 生成樹 乙個連通圖的生成樹是它的乙個極小連通子圖 從生成樹的定義可知,乙個連通圖的生成樹含有圖的全部n個頂點和n 1條邊。最小生成樹 minimal spanning tree 給連通圖的邊附上權值,則其所有權值之和最小的生成樹是最小生成樹。prim演算法構造最小生成樹 假設有連通圖g v...
最小生成樹(prim演算法)
最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...