RT
Kruskal 求点数为 (n−k+1) 的最小生成树。
不知为何 WA 了。
求 dalao 帮忙看看。
#include <bits/stdc++.h>
using namespace std;
int n, m, k, t;
int u, v, w;
int fa[1005];
struct Edge{
int u, v, w;
}e[10005];
int ans, sum;
bool cmp(Edge a, Edge b){return a.w < b.w;}
void build(){for(int i=1; i<=n; i++) fa[i] = i;}
int find(int u){if(u != fa[u]) fa[u] = find(fa[u]); return fa[u];}
void union_(int u, int v){fa[find(v)] = find(u);}
bool judge(int u, int v){return find(u) == find(v);}
int Kruskal()
{
int sum, res;
sum = 0, res = 0;
sort(e+1, e+m+1, cmp);
build();
for(int i=1; i<=m&&sum<=t-1; i++){
u = e[i].u, v = e[i].v, w = e[i].w;
if(judge(u, v) == true) continue;
union_(u, v);
sum++;
res += w;
}
return res;
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
t = n - k + 1;
for(int i=1; i<=m; i++){
scanf("%d%d%d", &u, &v, &w);
e[i] = {u, v, w};
}
ans = Kruskal();
for(int i=1; i<=n; i++){
if(i != fa[i]){
sum++;
}
}
if(sum < t - 1) printf("No Answer.");
else printf("%d", ans);
return 0;
}