题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数 NN,再给你 MM 个关系,表示哪些云朵可以连在一起。
现在小杉要把所有云朵连成 KK 个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入格式
第一行有三个数 N,M,KN,M,K。
接下来 MM 行每行三个数 X,Y,LX,Y,L,表示 XX 云和 YY 云可以通过 LL 的代价连在一起。
输出格式
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出 KK 个棉花糖,请输出 No Answer
。
输入输出样例
输入 #1复制
3 1 2 1 2 1
输出 #1复制
1
说明/提示
对于 30%30% 的数据,1≤N≤1001≤N≤100,1≤M≤1031≤M≤103;
对于 100%100% 的数据,1≤N≤1031≤N≤103,1≤M≤1041≤M≤104,1≤K≤101≤K≤10,1≤X,Y≤N1≤X,Y≤N,0≤L<1040≤L<104
做法
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
const int M=10010;
int n,m,k,ans;
int fa[N];
struct ty{
int u,v,w;
}e[M];
bool cmp(ty a,ty b){
return a.w<b.w;
}
int getfa(int x){
if(x==fa[x]) return x;
return fa[x]=getfa(fa[x]);
}
void setfa(int x,int y){
fa[getfa(x)]=getfa(y);
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
int cnt=0;//用了几条边
for(int i=1;i<=m;i++) {
if(getfa(e[i].u)==getfa(e[i].v)) continue;//在同一个生成树里,会形成回路
cnt++;
setfa(e[i].u,e[i].v);
ans+=e[i].w;
if(cnt==n-k) break;//要形成k个最小生成树,要用n-k条边
}
if(cnt==n-k) cout<<ans;
else cout<<"No Answer";
}