Prim演算法求最小生成樹

2021-10-03 05:16:48 字數 1273 閱讀 9941

樸素prim演算法:

1、距離初始化成正無窮

2、n次迭代-》找到集合外距離最近的點,賦值給t

3、用t更新其他點到集合的距離(跟狄傑斯塔拉不一樣,狄傑斯塔拉是跟原點的距離),點與集合所有點距離最短的點:st[t] = true

給定乙個n個點m條邊的無向圖,圖中可能存在重邊和自環,邊權可能為負數。

求最小生成樹的樹邊權重之和,如果最小生成樹不存在則輸出impossible。

給定一張邊帶權的無向圖g=(v, e),其中v表示圖中點的集合,e表示圖中邊的集合,n=|v|,m=|e|。

由v中的全部n個頂點和e中n-1條邊構成的無向連通子圖被稱為g的一棵生成樹,其中邊的權值之和最小的生成樹被稱為無向圖g的最小生成樹。

輸入格式

第一行包含兩個整數n和m。

接下來m行,每行包含三個整數u,v,w,表示點u和點v之間存在一條權值為w的邊。

輸出格式

共一行,若存在最小生成樹,則輸出乙個整數,表示最小生成樹的樹邊權重之和,如果最小生成樹不存在則輸出impossible。

資料範圍

1≤n≤5001≤n≤500,

1≤m≤1051≤m≤105,

圖中涉及邊的邊權的絕對值均不超過10000。

輸入樣例:

4 5

1 2 1

1 3 2

1 4 3

2 3 2

3 4 4

輸出樣例:

6
#include #include #include using namespace std;

const int n = 510, inf = 0x3f3f3f3f;

//稠密圖用鄰接矩陣來存

int n, m;

int g[n][n];

int dist[n];

bool st[n];

int prim()

return res;

}int main()

int t = prim();

if (t == inf) puts("impossible");//不存在生成樹,所有點不連通

else printf("%d\n", t);//存在返回t

return 0;

}

Prim演算法求最小生成樹

本文參考 google 資料結構 c語言 prim演算法,求最小生成樹 include include 最小生成樹prim define max 65535 using namespace std struct graph int prim graph g flag 0 1 將0號結點加入集合s i...

Prim演算法求最小生成樹

cost i j 存i和j之間的距離,vis i 記錄i點是否被訪問,lowc j 存所有與j點連線的邊的最小的權值。每次找最小的lowc j 然後。最小生成樹 int prim int cost maxn int n 點是0 n 1 if minc inf return 1 原圖不連通 ans m...

Prim演算法求最小生成樹

void prim matgraph g,int v for i 1 i 找出n 1個頂點 printf 邊 d,d 權為 d n closest k k,min lowcost k 0 標記k已經加入u for j 0 j 修改陣列lowcost和closest if g.edges k j 0 ...