洛谷 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原创

————————————————--我是分割线————————————————————

  1 /*
  2     Problem:
  3     OJ:
  4     User:S.B.S.
  5     Time:
  6     Memory:
  7     Length:
  8 */
  9 #include<iostream>
 10 #include<cstdio>
 11 #include<cstring>
 12 #include<cmath>
 13 #include<algorithm>
 14 #include<queue>
 15 #include<cstdlib>
 16 #include<iomanip>
 17 #include<cassert>
 18 #include<climits>
 19 #include<functional>
 20 #include<bitset>
 21 #include<vector>
 22 #include<list>
 23 #include<utility>
 24 #include<map>
 25 #define maxn 1001
 26 #define F(i,j,k) for(int i=j;i<=k;i++)
 27 #define rep(i,j,k) for(int i=j;i<k;i++)
 28 #define M(a,b) memset(a,b,sizeof(a))
 29 #define FF(i,j,k) for(int i=j;i>=k;i--)
 30 #define inf 0x3f3f3f3f
 31 #define maxm 10001
 32 #define mod 998244353
 33 //#define LOCAL
 34 using namespace std;
 35 inline int read(){
 36     int x=0,f=1;char ch=getchar();
 37     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 38     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 39     return x*f;
 40 }
 41 inline void out(int n){
 42     if(n<0){putchar('-');n=0-n;}
 43     if(n>=10) out(n/10);
 44     putchar((n%10)+'0');
 45     return;
 46 }
 47 int n,m,k;
 48 int tot,ans,cnt;
 49 struct EDGE
 50 {
 51     int from;
 52     int to;
 53     int value;
 54 }e[maxm];
 55 int fa[maxn],rank[maxn];
 56 inline void addedge(int u,int v,int w)
 57 {
 58     tot++;
 59     e[tot].from=u;
 60     e[tot].to=v;
 61     e[tot].value=w;
 62     return;
 63 }
 64 bool cmp(EDGE a,EDGE b) {return a.value<b.value;}
 65 inline void init() {F(i,1,n) fa[i]=i,rank[i]=0;}
 66 inline int find(int u) {return fa[u]==u ? u : fa[u]=find(fa[u]);}
 67 inline void Union(int a,int b)
 68 {
 69     int x=find(a),y=find(b);
 70     if(x==y) return;
 71     if(rank[x]>rank[y]) fa[x]=y;
 72     else{
 73         fa[y]=x;
 74         if(rank[x]==rank[y]) rank[y]++;
 75     }
 76 }
 77 int d[maxm],cur;
 78 inline void kruscal()
 79 {
 80     init();sort(e+1,e+m+1,cmp);
 81     F(i,1,m){
 82         int a=find(e[i].from),b=find(e[i].to);
 83         if(a==b) continue;
 84         else{
 85             d[++cur]=i;cnt++;ans+=e[i].value;
 86             Union(e[i].from,e[i].to);
 87         }
 88         if(cnt==(n-k)) break;
 89     }
 90 }
 91 int main()
 92 {
 93     std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y;
 94     #ifdef LOCAL
 95     freopen("data.in","r",stdin);
 96     freopen("data.out","w",stdout);
 97     #endif
 98     cin>>n>>m>>k;
 99     F(i,1,m){
100         int a,b,c;cin>>a>>b>>c;
101         addedge(a,b,c);
102     }
103     kruscal();
104     cout<<ans<<endl;
105     return 0;
106 }
View Code

 

posted @ 2016-11-23 15:33  SBSOI  阅读(404)  评论(0编辑  收藏  举报