洛谷P1195 口袋的天空

 

题目背景

小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。

题目描述

给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起。

现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。

输入输出格式

输入格式:

每组测试数据的

第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10)

接下来M个数每行三个数X,Y,L,表示X云和Y云可以通过L的代价连在一起。(1<=X,Y<=N,0<=L<10000)

30%的数据N<=100,M<=1000

输出格式:

对每组数据输出一行,仅有一个整数,表示最小的代价。

如果怎么连都连不出K个棉花糖,请输出'No Answer'。

输入输出样例

输入样例#1:
3 1 2
1 2 1
输出样例#1:
1

说明

厦门一中YMS原创

 

跑一遍kruskal,连n-k条边即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int INF=1e7;
 8 const int mxn=12000;
 9 int n,m,k;
10 int ans;
11 struct edge{
12     int x,y;
13     int v;
14 }e[mxn];
15 int cmp(const edge a,const edge b){
16     return a.v<b.v;
17 }
18 int fa[mxn];
19 void init(int x){
20     for(int i=1;i<=x;i++)fa[i]=i;return;
21 }
22 int find(int x){
23     if(fa[x]==x)return x;
24     return fa[x]=find(fa[x]);
25 }
26 void kruskal(){
27     init(n);
28     int i,j;
29     int cnt=0;
30     for(i=1;i<=m && cnt<n-k;i++){
31         int x,y;
32         x=find(e[i].x);y=find(e[i].y);
33         if(x!=y){
34             cnt++;
35             ans+=e[i].v;
36             fa[x]=y;
37         }
38     }
39     if(cnt!=n-k){
40         printf("No Answer\n");
41     }
42     else printf("%d\n",ans);
43     return;
44 }
45 int main(){
46     scanf("%d%d%d",&n,&m,&k);
47     ans=0;
48     int i,j;
49     for(i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].v);
50     sort(e+1,e+m+1,cmp);
51     kruskal();
52     return 0;
53 }

 

posted @ 2016-08-08 19:10  SilverNebula  阅读(198)  评论(0编辑  收藏  举报
AmazingCounters.com