最小生成樹 Prim

2021-07-11 21:28:14 字數 821 閱讀 7461

問題:參照[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 ...