图的四大应用
作者:
LC_toccc
,
2024-10-09 11:01:01
,
所有人可见
,
阅读 2
Prim
//Prim算法思想
//prim是寻找最小生成树的算法,从任意一个结点开始,遍历整个图,每次选择一个距离连通块最小的结点加入
//使用dist[]数组存储每个结点到连通块的最段路径
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 500, M = 1e5, INF = 0x3f3f3f3f;
int g[N][N], dist[N];
int n, m, k, res;
bool st[N];
int prim(){
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
res = 0;
for(int i = 1; i <= n; i++){
int t = -1;//每次遍历令t指向下一个要加入的结点
for(int j = 1; j <= n; j++){
if(!st[j] && (t == -1 || dist[j] < dist[t])) t = j;
}
if(dist[t] == INF) return INF;
st[t] = true;
res += dist[t];
for(int j = 1; j <= n; j++){//加入t结点后更新其他未遍历结点的dist[]
if(!st[j]){
dist[j] = min(dist[j], g[t][j]);//根据新加入的t结点,修改与t结点相连结点的dist[]数组
}
}
}
return res;
}
int main(){
memset(g, INF, sizeof g);
cin >> n >> m;
int a, b;
while(m--){
cin >> a >> b >> k;
g[a][b] = g[b][a] = min(k, g[a][b]);
}
int res = prim();
if(res == INF) cout << "该图无最小生成树" << endl;
else cout << res << endl;
return 0;
}