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[maxn];
 8 int N, M, K;
 9
10 struct Edge{
11     int u,v,w;
12 }e[maxm];
13
14 int find(int p){
15     if(p==parent[p]) return p;
16     parent[p]=find(parent[p]);
17     return parent[p];
18 }
19
20 int main(){
21     scanf("%d %d %d", &N, &M, &K);
22     for(int i=1;i<=N;++i){
23         parent[i]=i;
24     }
25     for(int i=1;i<=M;++i){
26         int u,v,w;
27         scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].w);
28     }
29     sort(e+1,e+M+1,[](Edge e1, Edge e2){
30         return e1.w<e2.w;
31     });
32     int res=0;
33     int cnt=0;
34     for(int i=1;i<=M;++i){
35         int u=e[i].u;
36         int v=e[i].v;
37         if(find(u)==find(v)) continue;
38         cnt++;
39         res+=e[i].w;
40         parent[find(u)]=find(v);
41         if(cnt==N-K){
42             printf("%d", res);
43             return 0;
44         }
45     }
46     printf("No Answer");
47     return 0;
48 }

原文地址:https://www.cnblogs.com/FEIIEF/p/12246104.html

时间: 2024-10-12 04:40:58

P1195 口袋的天空 (生成树)的相关文章

P1195 口袋的天空

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

洛谷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 口袋的天空

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

luogu P1195 口袋的天空

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

luoguP1195 口袋的天空 x

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

【最小生成树】口袋的天空

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

vijos P1234口袋的天空(Kruskal)(最小生成树)

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

口袋的天空

题目描述 给你云朵的个数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%的数据