求助,WA了9个点
查看原帖
求助,WA了9个点
232838
huangkx楼主2021/8/25 21:27

RTRT
Kruskal 求点数为 (nk+1)(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;
}
2021/8/25 21:27
加载中...