题目背景

小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。

有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。

题目描述

给你云朵的个数 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 }