题目地址
https://www.luogu.org/problemnew/show/P1195
题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数 N ,再给你 M 个关系,表示哪些云朵可以连在一起。
现在小杉要把所有云朵连成 K 个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入输出格式
输入格式:
每组测试数据的
第一行有三个数 $N,M,K(1 \le N \le 1000,1 \le M \le 10000,1 \le K \le 10)N,M,K(1≤N≤1000,1≤M≤10000,1≤K≤10)$
接下来 MM 个数每行三个数 X,Y,LX,Y,L ,表示 XX 云和 YY 云可以通过 LL 的代价连在一起。$ (1 \le X,Y \le N,0 \le L<10000)(1≤X,Y≤N,0≤L<10000)$
30\0% 的数据 $N \le 100,M \le 1000N≤100,M≤1000$
输出格式:
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出 K 个棉花糖,请输出'No Answer'。
输入输出样例
输入样例#1:
3 1 2
1 2 1
输出样例#1:
1
说明
厦门一中YMS原创
思路
根据题目所说,我们将一个棉花糖看做一棵树,那么一共要生成K棵树
我们知道一棵有N个节点的树一共有N-1条边,那么对于N个节点,要有K棵树的话就要先生成一棵有N-K条边的树
其余的K-1个节点,每个节点作为一棵树
这就完成了K棵树
要使得代价最小,那么就要用最小生成树算法
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
const int maxn =
1003;
using namespace std;
int n, m, k, f[maxn], tot, Ans;
struct edge{
int u, v, w;
}ed[10003];
int find(
int x) {
if(f[x] == x)
return x;
else return f[x] =
find(f[x]);
}
bool cmp(edge a, edge b) {
return a.w <
b.w;
}
int main() {
scanf("%d%d%d", &n, &m, &
k);
for(
int i=
1; i<=n; i++) f[i] =
i;
for(
int i=
1; i<=m; i++
) {
scanf("%d%d%d", &ed[i].u, &ed[i].v, &
ed[i].w);
}
sort(ed+
1, ed+
1+
m, cmp);
for(
int i=
1; i<=m; i++
) {
int xx = find(ed[i].u), yy =
find(ed[i].v);
if(xx !=
yy) {
f[xx] =
find(yy);
tot++
;
Ans +=
ed[i].w;
}
if(tot == n-k)
break;
}
if(tot < n-
k) {
printf("No Answer\n");
return 0;
}
printf("%d", Ans);
}
转载于:https://www.cnblogs.com/bljfy/p/9260727.html
相关资源:锣鼓声声迎新春——新年工作计划ppt模板.zip