#include <iostream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> arr;
vector<int> dis;
vector<int> isVisit;
int n,m;
int prime(int start) {
int ans = 0;
dis[start] = 0;
for(int cnt = 0; cnt < n; cnt++) {
int u = -1;
for(int i = 0; i < n; i++) {
if(!isVisit[i]) {
if(u == -1 || dis[u] > dis[i])
u = i;
}
}
if(dis[u]==INT_MAX)
return -1;
isVisit[u] = 1;
ans += dis[u];
for(int i = 0; i < n; i++)
if(!isVisit[i] && arr[u][i] > 0 && dis[i]>arr[u][i])
dis[i] = arr[u][i];
}
return ans;
}
int main() {
int x, y, w;
cin >> n>>m;
arr.resize(n);
dis.resize(n, INT_MAX);
isVisit.resize(n, 0);
for(int i=0; i<n; ++i)
arr[i].resize(n,0);
for(int i = 0; i < m; ++i) {
cin >> x >> y >> w;
arr[x][y] = w;
arr[y][x] = w;
}
cout<<prime(0)<<endl;
return 0;
}
最小生成树-Prim算法
最新推荐文章于 2024-05-20 20:08:58 发布