题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数 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% 的数据,N \le 100N≤100,M \le 10^3M≤103;
对于 100\%100% 的数据,1 \le N \le 10^31≤N≤103,1 \le M \le 10^41≤M≤104,1 \le K \le 101≤K≤10,1 \le X,Y \le N1≤X,Y≤N,0 \le L<10^40≤L<104。
代码如下: 同样模板题
#include<bits/stdc++.h>
using namespace std;
int n , m , k;
int par[100005];
struct road
{
int c1 , c2 , d;
}a[100005];
int find(int x)
{
if(x==par[x]) return x;
else return par[x]=find(par[x]);
}
bool unite(int x , int y)
{
x=find(x);
y=find(y);
if(x!=y) {par[y]=x;n--;return true;}
else return false;
}
bool cmp( road a , road b)
{
return a.d<b.d;
}
int main()
{
int sum=0;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
par[i]=i;
for(int i=1;i<=m;i++)
{
cin>>a[i].c1>>a[i].c2>>a[i].d;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(unite(a[i].c1,a[i].c2))
sum+=a[i].d;
// cout<<sum;
if(n==k) {cout<<sum<<endl;return 0;}
}
cout<<"No Answer";
return 0;
}