#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e3 + 10, M = 3 * N;
int n, m; //nums of village, road
int p[N]; //父亲
struct Edge{
int a, b, w;
bool operator <(const Edge &tmp)const
{
return w < tmp.w;
}
}edges[M];
//并查集
int find(int u)
{
if(u != p[u]) p[u] = find(p[u]);
return p[u];
}
int Kruskal()
{
for(int i = 0; i < N; i++) p[i] = i; //初始化并查集
sort(edges, edges + m); //排序
int res = 0, cnt = 0;
for(int i = 0; i < m; i++)
{
int a = edges[i].a, b = edges[i].b, w = edges[i].w;
a = find(a), b = find(b);
if(a != b) //未连通
{
p[b] = a;
res += w;
cnt ++;
}
}
if(cnt < n - 1) return -1;
else return res;
}
int main()
{
//读取输入
cin >> n >> m;
for(int i = 0; i < m; i++)
cin >> edges[i].a >> edges[i].b >> edges[i].w;
cout << Kruskal();
return 0;
}
7-6 公路村村通 (30 分) | 最小生成树
最新推荐文章于 2023-06-08 14:07:48 发布