問題:參照[kruskal]
原理:prim演算法使用的是一種貪心的思想,通過從乙個點出發,選擇所有鏈結這乙個點的邊中,選擇權值最小的邊。
在選擇了這一條邊之後,優化之前的邊的選擇方案。在最後,把所有的最小邊之和加起來就得到了最小的方案
來看乙個例子
首先,在第乙個點的所有鏈結的邊中,選擇鏈結到5的邊,設定到達2的最小邊為7。
從5出發,發現到4的邊最短,選擇這一條邊。將到達3的最小邊設定為2
查詢4號點,發現邊的長度為6,比到達3的最小邊2要長,返回到出發點為5,鏈結到3
查詢3,發現到達2號店的5要比之前記錄的長度要短,選擇這一條邊。發現全部點都被訪問了一次,結束迴圈。
最後得到這樣的一幅圖,組成了最小生成樹
計算到這乙個圖的最小生成樹的長度為12 參
考程式:
#include#include
const int maxn = 1010,
inf = 0x7ffffff;
int n,m;
int min_cost;
int adj[maxn][maxn];
bool f[maxn];
int len_min[maxn];
int from_num[maxn];
void _prim()
for(int i=1;i<=n;i++)
min_cost=0;
f[1]=true;//一號節點設定為訪問過
_prim();
printf("%d\n",min_cost);
return 0;
}
最小生成樹 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 ...