原题

题目背景

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

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

题目描述

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

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

输入格式

第一行有三个数 N,M,KN,M,KN,M,K。

接下来 MMM 行每行三个数 X,Y,LX,Y,LX,Y,L,表示 XXX 云和 YYY 云可以通过 LLL 的代价连在一起。

输出格式

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

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

样例 #1

样例输入 #1

3 1 2
1 2 1

样例输出 #1

1

提示

对于 30%30\%30% 的数据,1≤N≤1001 \le N \le 1001≤N≤100,1≤M≤1031\le M \le 10^31≤M≤103;

对于 100%100\%100% 的数据,1≤N≤1031 \le N \le 10^31≤N≤103,1≤M≤1041 \le M \le 10^41≤M≤104,1≤K≤101 \le K \le 101≤K≤10,1≤X,Y≤N1 \le X,Y \le N1≤X,Y≤N,0≤L<1040 \le L<10^40≤L<104。

非常明显的拓扑排序,这里就用Krushkal了
时间复杂度:
O(n+mlogm)O(n+mlogm)O(n+mlogm)

边的数据规模比较小,Krushkal不会超时
Krushkal的原理
...... 8
......o-o
2|.........|7
......o-o
...... 6
我们假设上面是一张图(画的不太好),接下来要找出他的最小生成树
Krushkarl是怎么做的呢?
他先找到最小边,也就是权值为2的边
接着,这条边就进生成树里了
接下来再找现在最小的……\ldots\ \ldots… …
但是,如果出现自环(比如当枚举到第四小的边,权值为8),这时候,Krushkal就会退出
但Krushkal是怎么记录出现自环的呢?这时候就要用到大名鼎鼎的并查集啦

Krushkal模板

namespace disjoint_set{//并查集int f[100007];void init(int m){//初始化for(int i=1;i<=m;i++)f[i]=i;}int find(int x){//寻找x的老大return (x==f[x])?x:f[x]=find(f[x]);}void merge(int x,int y){//并入f[find(x)]=find(y);}
}
namespace Krushkals{//最小生成树using namespace disjoint_set;struct e{int w,u,v; }Edge[100007];//边集数组void inpute(int m){//输入函数for(int i=1;i<=m;i++)scanf("%d %d %d",&Edge[i].u,&Edge[i].v,&Edge[i].w);}bool cmp(e a,e b){//判断函数(用于sort)return a.w<b.w;}int Krushkal(int m,int n,int k=1){//Krushkal主函数int sum=0;//答案init(m);//初始化并查集sort(Edge+1,Edge+m+1,cmp);//排序,找出最小边int num=n;//注:这是判断是否能连成k块用的for(int i=1;i<=m;i++)//枚举if(find(Edge[i].u)!=find(Edge[i].v)){//若没有环......merge(Edge[i].u,Edge[i].v);//并入sum+=Edge[i].w;//答案增加权值(代价)num--;//块数减少if(num==k)//达到k了!return sum;//返回答案}return -1;//没达到k}
}

接下来便是主函数

#include<bits/stdc++.h>
using namespace std;
using namespace Krushkals;
int n,m,k;
int main(){//输入scanf("%d %d %d",&n,&m,&k);impute(m);//运行if(Krushkal(m,n,k)!=-1)puts("-1");elseprintf("%d",Krushkal(m,n,k));return 0;
}

合起来就是答案

#include<bits/stdc++.h>
using namespace std;
namespace disjoint_set{//并查集int f[100007];void init(int m){//初始化for(int i=1;i<=m;i++)f[i]=i;}int find(int x){//寻找x的老大return (x==f[x])?x:f[x]=find(f[x]);}void merge(int x,int y){//并入f[find(x)]=find(y);}
}
namespace Krushkals{//最小生成树using namespace disjoint_set;struct e{int w,u,v; }Edge[100007];//边集数组void inpute(int m){//输入函数for(int i=1;i<=m;i++)scanf("%d %d %d",&Edge[i].u,&Edge[i].v,&Edge[i].w);}bool cmp(e a,e b){//判断函数(用于sort)return a.w<b.w;}int Krushkal(int m,int n,int k=1){//Krushkal主函数int sum=0;//答案init(m);//初始化并查集sort(Edge+1,Edge+m+1,cmp);//排序,找出最小边int num=n;//注:这是判断是否能连成k块用的for(int i=1;i<=m;i++)//枚举if(find(Edge[i].u)!=find(Edge[i].v)){//若没有环......merge(Edge[i].u,Edge[i].v);//并入sum+=Edge[i].w;//答案增加权值(代价)num--;//块数减少if(num==k)//达到k了!return sum;//返回答案}return -1;//没达到k}
}
using namespace Krushkals;
int n,m,k;
int main(){//输入scanf("%d %d %d",&n,&m,&k);impute(m);//运行printf("%d",Krushkal(m,n,k));return 0;
}

洛谷P1195 口袋的天空相关推荐

  1. 洛谷 P1195 口袋的天空 (题解+代码)

    题目传送门:https://www.luogu.com.cn/problem/P1195 题解: 由于需要有k个棉花糖,则可理解为将云朵分成k个部分. 特判棉花糖大于云朵的数量,此时无解. 那么对于一 ...

  2. 洛谷 1195 口袋的天空 最小生成树 解题报告

    题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在 ...

  3. 洛谷 1195 口袋的天空

    传送门 并查集水题. //Twenty #include<algorithm> #include<iostream> #include<cstdlib> #incl ...

  4. P1111 修复公路P1195 口袋的天空

    目录 P1111 修复公路 P1195 口袋的天空 P1111 修复公路 题目链接:https://www.luogu.com.cn/problem/P1111 标签:并查集,最小生成树 思路:本题用 ...

  5. 【P1195 口袋的天空】

    P1195 口袋的天空 口袋的天空 题目背景 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 题意及分析 放代码 口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗 ...

  6. P1195 口袋的天空-Kruskal(优先队列+并查集)

    口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数 N N N,再给你 M M ...

  7. 【洛谷】P1195 口袋的天空

    明显看出为最小生成树, 那么:难点在哪里呢? if(cnt==n-k)//******{flag=1;break;} 为什么是cnt==n-k呢而不是k呢?!!! 解释:(如果每个已经连在一起了就不能 ...

  8. P1195 口袋的天空【并查集】

    题目链接 参考题解 有一句话说的是 如果n个点被n-1条边连接的话,这一定是棵树. 那么: 连的边数 得到的树的个数 n-1 1 n-2 2 n-3 3 - - n-k k 所以我们如果想要连出k棵树 ...

  9. 最小生成树——洛谷并查集、口袋的天空

    最小生成树--并查集 简单模板题-洛谷3367并查集 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 第一行包含两个整数 N,MN,M ,表示共有 NN 个元素和 MM 个操作 ...

  10. 洛谷 深基 第1部分 语言入门 第4章 循环结构程序设计(2022.02.14)

    P5718 [深基4.例2]找最小值 [深基4.例2]找最小值 - 洛谷 P5718 [深基4.例2]找最小值(python3实现)-2022.02.01 P5718 [深基4.例2]找最小值(pyt ...

最新文章

  1. asp.net 在 Ngnix 服务器 中配置攻略
  2. 实用线性代数和凸优化 Convex Optimization
  3. 【案例解析】 e家洁创始人:O2O创业的痛点与深坑
  4. bios设置_大白菜U盘启动BIOS设置教程
  5. Android之记住密码与自动登陆实现
  6. aspx转发php_asp,php,aspx一句话合集
  7. 窗体间的跳转传值 1127
  8. x86平台堆栈优化问题
  9. mysql默认存储引擎的索引结构是_InnoDB引擎的索引和存储结构
  10. oracle 11g 及 plsqldeveloper 相关操作
  11. 任务计划程序设置软件在电脑重启后启动
  12. 静态化 - 真静态技术
  13. Oracle 进程 说明
  14. Git版本控制:Git远程仓库
  15. 1、Java多线程基础:进程和线程之由来
  16. [病毒分析]熊猫烧香应急处理方法
  17. 此版本的IDM不支持该类下载,请尝试将IDM更新至最新版本。
  18. 深入理解JVM - 虚拟机字节码指令集
  19. 一款网站炫酷底部美化源码
  20. linux退出文件命令行,linux的top命令详解及退出操作

热门文章

  1. smart3d4.4.5_在Android 5.0中使用Smart Lock,再也不必在家中解锁手机
  2. 剪刀石头布java流程图_青岛能源所基于“剪刀石头布”策略实现快速多轮基因编辑...
  3. C++定义复数类(Complex)
  4. 信息安全-网络安全审计技术原理与应用
  5. 申请免费域名 + SSL 证书的方法
  6. html链接屏蔽了,js屏蔽广告/屏蔽网站元素/屏蔽网站超链接
  7. [渝粤题库]西北工业大学中国古代法制史
  8. 使用sphinx+markdown来编写文档,生成html和pdf
  9. 推荐几个选择时间.日期的免费插件 js
  10. Java+spring+springmvc 基于ssm的超市进销存管理系统#毕业设计