口袋的天空
题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数 N,再给你 M个关系,表示哪些云朵可以连在一起。
现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入格式
第一行有三个数 N,M,K。
接下来 M 行每行三个数 X,Y,L,表示 X 云和 Y云可以通过L 的代价连在一起。
输出格式
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出 K 个棉花糖,请输出 `No Answer`。
样例
样例输入
3 1 2
1 2 1
样例输出
1
解题思路
这道题我们使用克鲁斯卡尔算法,对输入数据建图,再进行处理,最后可得最小生成树的大小,对比数据输出对应答案即可
参考代码
#include<bits/stdc++.h>
using namespace std;
int tree[114514],n,m,dit,ans,k;
struct node{
int u,v,w;
}e[114514];
bool cmp(node a,node b){
return a.w<b.w;
}
int fd(int v){
return v == tree[v]?v:tree[v] = fd(tree[v]);
}
bool bd(int l,int r){
int u = fd(l);
int v = fd(r);
if(u!=v){
tree[v] = u;
return true;
}
return false;
}
int main(){
cin>>n>>m>>k;
for(int i = 0;i<=n;i++){
tree[i] = i;
}
for(int i = 1;i<=m;i++){
cin>>e[i].u>>e[i].v>>e[i].w;
}
sort(e+1,e+m+1,cmp);
for(int i = 1;i<=m;i++){
if(bd(e[i].u,e[i].v)){
ans+=e[i].w;
if(++dit == n-k){
cout<<ans;
return 0;
}
}
}
cout<<"No answer";
return 0;
}