题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数 N,再给你 M 个关系,表示哪些云朵可以连在一起。
现在小杉要把所有云朵连成 K 个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入格式
第一行有三个数 N,M,K。
接下来 M 行每行三个数 X,Y,L,表示 X 云和 Y 云可以通过 L 的代价连在一起。
输出格式
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出 K 个棉花糖,请输出 No Answer
。
AC代码
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 5 ll n,m,k,fa[10010],tmp,ans; 6 struct node{ 7 ll x,y,v; 8 }a[10010]; 9 10 ll find (ll x) 11 { 12 return fa[x]==x?x:fa[x]=find(fa[x]); 13 } 14 15 bool cmp(node t1,node t2) 16 { 17 return t1.v<t2.v; 18 } 19 20 int main() 21 { 22 scanf("%lld%lld%lld",&n,&m,&k); 23 for (int i=1;i<=n;i++) 24 fa[i]=i; 25 for (int i=1;i<=m;i++) 26 { 27 scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].v); 28 } 29 sort(a+1,a+1+m,cmp); 30 for (int i=1;i<=m&&tmp<n-1;i++) 31 { 32 ll t1,t2; 33 t1=find(a[i].x); 34 t2=find(a[i].y); 35 if (t1!=t2) 36 { 37 ans+=a[i].v; 38 tmp++; 39 fa[t1]=t2; 40 } 41 if (tmp==n-k) 42 { 43 cout<<ans; 44 return 0; 45 } 46 } 47 cout<<"No Answer"; 48 return 0; 49 }