[vijos1234]口袋的天空最小生成树
题目链接:https://vijos.org/p/1234
白天刚刚写完prim的算法,晚上就心血来潮的打了一道最小生成树的题
虽然有题解说可以用prim做,但是这道题明显是加最小的边,感觉kruskal方便多了
但是愉快的是我竟然不是一次过,最后发现是题意理解问题,我之前读了很多遍题,还是以为n朵云不用用完,但其实是n朵云要用完并成为k个棉花糖
首先可以知道的是,k个棉花糖中有k-1个是单个的云,因为单个的云就是不要花费的,所以生成树就是在剩下的n-k+1朵云中产生,然后这n-k+1朵云最多用n-k+1-1条边连接是最优的,所以其实就是kruskal选出n-k+1-1条边的最小价值
然后就是一个裸的kruskal了,然后由于很久没打kruskal了,我竟然自作聪明的加了vis数组,然后光荣爆零,最后删去vis,只用并查集判断就瞬间a了
果然是我太弱了吗
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<cstdlib> 7 #define maxn 10005 8 using namespace std; 9 10 struct edge{ 11 int u,v,w; 12 }e[2*maxn]; 13 14 int n,m,k,pos,tot,ans; 15 int head[maxn],fa[maxn]; 16 17 int read(){ 18 int xx=0,ff=1;char ch=getchar(); 19 while(ch<'0'||ch>'9'){if(ch=='-')ff=-1;ch=getchar();} 20 while(ch>='0'&&ch<='9'){xx=xx*10+ch-'0';ch=getchar();} 21 return xx*ff; 22 } 23 24 void adde(int u,int v,int w){ 25 e[++pos].u=u; 26 e[pos].v=v;e[pos].w=w; 27 } 28 29 int comp(const void*a,const void*b){ 30 return (*(struct edge*)a).w>(*(struct edge*)b).w?1:-1; 31 } 32 33 int find_(int x){ 34 if(fa[x]==x)return fa[x]; 35 return fa[x]=find_(fa[x]); 36 } 37 38 int main(){ 39 scanf("%d",&n);m=read();k=read(); 40 for(int i=1;i<=m;i++){ 41 int u,v,w; 42 u=read();v=read();w=read(); 43 adde(u,v,w); 44 } 45 if(k>n){ 46 printf("No Answer");return 0; 47 } 48 for(int o=1;o<=n;o++) 49 fa[o]=o; 50 qsort(e,m+1,sizeof(e[0]),comp); 51 for(int i=1;i<=m;i++){ 52 int u=e[i].u,v=e[i].v; 53 int fu=find_(u);int fv=find_(v); 54 if(fu!=fv){ 55 fa[fu]=fv; 56 tot++;vis[fv]=1;ans+=e[i].w; 57 } 58 if(tot>=n-k+1-1){ 59 printf("%d",ans);return 0; 60 } 61 } 62 printf("No Answer"); 63 }
kruskal
【总结】
头可断,血可流,代码错不得
注意判断选入边的条件,理解并查集的运用,不能死记硬背
转载于:https://www.cnblogs.com/Danzel-Aria233/p/7749238.html
[vijos1234]口袋的天空最小生成树相关推荐
- 洛谷 1195 口袋的天空 最小生成树 解题报告
题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在 ...
- Vijos1234 口袋的天空 题解
博客园同步 原题链接 简要题意: 求把一个图分成 k k k 个连通块并连接连通块的最小价值. 一种类似于 prim \texttt{prim} prim 贪心的做法. 即用 并查集 维护当前节点所属 ...
- 最小生成树——洛谷并查集、口袋的天空
最小生成树--并查集 简单模板题-洛谷3367并查集 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 第一行包含两个整数 N,MN,M ,表示共有 NN 个元素和 MM 个操作 ...
- 【P1195 口袋的天空】
P1195 口袋的天空 口袋的天空 题目背景 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 题意及分析 放代码 口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗 ...
- P1111 修复公路P1195 口袋的天空
目录 P1111 修复公路 P1195 口袋的天空 P1111 修复公路 题目链接:https://www.luogu.com.cn/problem/P1111 标签:并查集,最小生成树 思路:本题用 ...
- P1195 口袋的天空-Kruskal(优先队列+并查集)
口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数 N N N,再给你 M M ...
- 【c++图论】【口袋的天空】【部落划分】
目标: 今天的两道题做法和思路有相同之处,合并在一起学习可以帮助更快的掌握图论中克鲁斯卡尔算法的要点和据具体实现步骤,下面来看看题目: 第一题[口袋的天空] 题目如下 题目背景 小杉坐在教室里,透过口 ...
- 张韶涵《口袋的天空》小提琴谱片段
很喜欢张韶涵<口袋的天空>这首歌,每次听感觉都很好.中间有一段小提琴的乐曲,听着特别感人. 找了很久的<口袋的天空>的小提琴谱,一直没有找到,终于有一次找到了这段小提琴谱,2分 ...
- VIJOS【1234】口袋的天空
背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. ...
最新文章
- 如何解决数据丢失问题
- javascript运算符_JavaScript中的按位运算符
- python二级考试选择题公共基础知识_计算机二级Python易忘考点整理
- Sublime Text 全程指南
- 碌人乘凉-- AERCHI 你所不懂的
- Excel里如何更改坐标轴起始位置使图落在正中心
- Concurrent and Parallel
- C# winform程序运行在XP
- Globle Get 多线程下载系统
- 批量查询网站收录情况的站长工具
- 五、构建deb软件安装包
- Quoted-printable 编码认识、介绍、编码解码转换
- 前端做微信好友分享_前端-微信分享
- 盘一盘那些开设了大数据专业的中国高校
- 一位川大师兄的计算机之路
- Kubernetes 之 二进制安装(二) 证书详解
- 近视200度能学计算机吗,近视200度能不能恢复 近视200度该怎么办
- leetcode面试题 804. 唯一摩尔斯密码词
- 手机麦克风结构原理图_驻极体话筒构造和原理
- 加快下载速度:Win10将用P2P传输App与系统更新
热门文章
- matlab神经网络工具箱函数汇总
- 【Android】adb命令总结
- android wear无法启用,android-wear – 无法创建Android虚拟设备,“没有为此目标安装系统映像”...
- linux 物理内存用完了_Linux用户空间与内核空间(理解高端内存)
- 24点游戏c语言链表做法,C语言实现24点程序(示例代码)
- Linux服务器部署ssl证书教程,linux服务器在wdcp面板安装ssl证书教程
- php读取js验证码,PHP + JS 实现验证码功能
- 5如何将表格的一行数据清空_微信公众号推文中如何自定义添加表格?
- python迷宫万花筒代码_利用广度优先遍历搜索迷宫的python源代码
- 线程、线程匿名内部类、解决线程不安全的方式