原题链接
这是一道简单的图论问题。首先,用n-k条边连成无环图,就有k棵树了,而题目的意思正是如此。利用Kruskal算法,就可以写了。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int un[1010];
int n, m, k;
struct Cl {
int x, y, w;
}cl[10010];
bool cmp(Cl cl1, Cl cl2) {
return cl1.w < cl2.w;
}
int find(int x) {
if (x == un[x])
return x;
else return un[x] = find(un[x]);
}
void unity(int x, int y) {
un[find(x)] = un[find((y))];
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m >> k;
for (int i = 0; i < n; i++)
un[i] = i;
for (int i = 0; i < m; i++)
cin >> cl[i].x >> cl[i].y >> cl[i].w;
sort(cl, cl + m, cmp);
int t = 0;
int sum = 0;
for (int i = 0; i < m; i++) {
if (find(cl[i].x) != find(cl[i].y)) {
unity(cl[i].x, cl[i].y);
sum += cl[i].w;
t++;
}
if (t == n - k) {
cout << sum;
return 0;
}
}
cout << "No Answer";
return 0;
}