#include<bits/stdc++.h>
using namespace std;
const int Inf = 0x3f3f3f3f;
const int N = 1e4 + 10;
int n, m;
int a[N][N];
int prim(){
int mst[N], low[N], ans = 0;
mst[1] = 0;
for(int i = 2; i <= n; i++){
low[i] = a[1][i];
mst[i] = 1;
}
for(int i = 2; i <= n; i++){
int minx = Inf, minid;
for(int j = 2; j <= n; j++){
if(low[j] < minx && low[j]){
minid = j;
minx = low[j];
}
}
ans += minx;
low[minid] = 0;
for(int j = 2; j <= n; j++){
if(a[minid][j] < low[j]){
low[j] = a[minid][j];
mst[j] = minid;
}
}
}
return ans;
}
int main(){
while(scanf("%d%d", &n, &m) == 2){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
a[i][j] = Inf;
}
}
for(int i = 0; i < m; i++){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
a[u][v] = a[v][u] = w;
}
printf("%d\n", prim());
}
}
/*
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
*/
个人模板 prim 最小生成树
最新推荐文章于 2024-07-24 01:35:50 发布