原题链接:[kuangbin带你飞]专题六 最小生成树 B - Networking
最小生成树问题。
Input: m, n 图的两个顶点和权值
Output: 最短权值之和
//#include"stdafx.h"
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct edge
{
int s, e, w;
};
edge e[100008];
int p[100000];
int m, n;
bool cmp(edge a, edge b) { return a.w < b.w; }
int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }
void kruscal()
{
int ans = 0;
sort(e, e + n, cmp);
for (int i = 0; i < n; i++)
{
int x = find(e[i].s);
int y = find(e[i].e);
if (x != y)
{
p[x] = y;
ans += e[i].w;
}
}
cout << ans << endl;
}
int main()
{
while (1)
{
cin >> m>>n;
if (0 == m) break;
for (int i = 0; i < n; i++) p[i] = i;
int s, end, w;
for (int i = 0; i < n; i++)
{
cin >> s >> end >> w;
e[i].s = s-1, e[i].e = end - 1, e[i].w = w;
}
kruscal();
}
return 0;
}