洛谷 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 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,k,tot,MST=0,fa[2010];
 7 #define maxm 10000
 8 struct Edge{
 9     int to,value,from;
10     bool operator < (const Edge &a ) const{
11         return value<a.value;
12     }
13 }e[maxm*2+10];
14 void Add_Edge(int u,int v,int w){
15     e[++tot].to=v;e[tot].value=w;e[tot].from=u;
16 }
17 int Find(int x){
18     if(x==fa[x])return x;
19     else return fa[x]=Find(fa[x]);
20 }
21 int main()
22 {
23
24     scanf("%d%d%d",&n,&m,&k);
25     for(int i=1,u,v,w;i<=m;i++){
26         scanf("%d%d%d",&u,&v,&w);
27         Add_Edge(u,v,w);
28     }
29     if(n<k){
30         printf("No Answer\n");
31         return 0;
32     }
33     sort(e+1,e+tot+1);
34     for(int i=1;i<=n+10;i++) fa[i]=i;
35     int cur=0;
36     for(int i=1;i;i++){
37         int v=e[i].to,u=e[i].from;
38         int rx=Find(u),ry=Find(v);
39         if(rx!=ry){
40             cur++;
41             MST+=e[i].value;
42             fa[rx]=ry;
43         }
44         if(cur == n-k )break;
45     }
46     printf("%d",MST);
47     return 0;
48 }
49 /*思路 :取 前K条边  连成一棵最小生成树
50 其余的单独成树
51 */
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,k,ans,fa[1111];
 7 struct node{
 8     int from;
 9     int to;
10     int value;
11     bool operator <(const node &a)const
12     {
13         return value<a.value;
14     }
15 }Edge[11111];
16 int find(int x)
17 {
18     if(x==fa[x]) return x;
19     else return fa[x]=find(fa[x]);
20 }
21 int main()
22 {
23     cin>>n>>m>>k;
24     int x,y,l;
25     for(int i=1;i<=m;i++)
26     {
27         cin>>x>>y>>l;
28         Edge[i].from=x;
29         Edge[i].to=y;
30         Edge[i].value=l;
31     }
32
33     for(int i=1;i<=n;i++)
34       fa[i]=i;
35
36      sort(Edge+1,Edge+m+1);
37
38     int js=1,h=1;
39     // js 是当前已用边数
40     // 此题是个最小生成树问题  需成多棵树
41     // h 用于记录排好序的边中 用到了第几条
42     if((k>n)||((n-k)>m))//  (n-k)k棵最小生成树 需要的边数 然而只有m条边so~~
43     {
44         printf("No Answer\n");
45         return 0;
46     }
47     while(js<=n-k)// 生成一棵树用n-1条边,k棵则需要n-k条边
48     {
49
50         int rx=Edge[h].from;
51         int ry=Edge[h].to;
52         int w=Edge[h].value;
53         int fx=find(rx);int fy=find(ry);
54         if(fx!=fy)
55         {
56             js++;
57             fa[fx]=fy;
58             ans+=w;
59         }
60         h++;
61     }
62
63      printf("%d\n",ans);
64
65     return 0;
66 }

思路:见代码中的解释

时间: 2024-10-12 03:49:43

洛谷 P1195 口袋的天空的相关文章

洛谷P1195 口袋的天空 并查集

洛谷P1195 口袋的天空 并查集 将边从小到大排序,然后依次加边 看看是否能变成 K 个连通块,以及其最小话费 1 #include <cstdio> 2 #include <algorithm> 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using namespace std ; 5 6 const int N = 1011,M = 10011,inf = 1e9 ; 7 struct edge{ 8 int x,y,val

洛谷P1195 口袋的天空

口袋的天空 327通过 749提交 题目提供者该用户不存在 标签云端 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 暂时没有讨论 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入

P1195 口袋的天空

P1195 口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入格式: 每组测试数据的 第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10) 接下来

luogu P1195 口袋的天空

题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入格式: 每组测试数据的 第一行有三个数N,M,K(1<=N<=1000,1<=M<=10000,1<=K<=10) 接下来M个数每行三个数X,Y,

P1195 口袋的天空 (生成树)

题目链接 解法: 初始n个节点,n颗树,每连一条边,减少一棵树.k棵树需要连n-k条边...1棵树需要连n-1条边... 给每条可以连的边按代价从小到大排个序,然后连n-k条边造k个最小生成树就可以了. Code: 1 #include <bits/stdc++.h> 2 # define LL long long 3 using namespace std; 4 5 const int maxn=1000+10; 6 const int maxm=10000+10; 7 int parent

luoguP1195 口袋的天空 x

P1195 口袋的天空 378通过 867提交 题目提供者该用户不存在 标签 云端 难度 普及+/提高 时空限制 1s / 128MB 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. 现在小杉要把所有云朵连成K个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小. 输入输出格式 输入格式: 每组测试数据的 第一行有三个

约数和问题(codevs2606&amp;amp;&amp;amp;洛谷2424)

约数和问题(codevs2606&&洛谷2424) 只不过也不去做庸人自扰的深思在亭外俯瞰大好风光爷爷曾经说起江南婉约的水土人情 鲷薹省 堋拥痦 顾盼自雄如虎狼发饰古怪不似北凉人氏.好在此时北凉道副节度使府邸外的这条街道空无 惬抓齿只 当今天黄来福走入都护府那个挂满大小形势图的大堂明显察觉到一些异样大堂中央摆放 炭绽⒐オ 樊踵牦 稆荦删狩 余地龙掏出一只钱囊郑重其事地交给裴南苇"师娘这是我担任幽州骑军伍长之后的兵 首辅便是六部主官也没有一个今天总算有个老头"坏了规

洛谷 P1948 [USACO08JAN]电话线Telephone Lines

P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncooperative, so he needs to pay for some of the cables required to connect his farm to the phone system. There a

【基础练习】【背包DP】洛谷1164 小A点菜题解

洛谷的题目又有那令人···的悲剧格式= = 洛谷1164 小A点菜 本题地址:http://www.luogu.org/problem/show?pid=1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000). 餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种