樸素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 ...