随笔分类 -  最小生成树

摘要:参考了这篇题解,真的写的很好。 我们直接跑最小生成树时,会出现三种情况: 白边多了 白边少了 白边刚刚好 对于最后一种情况,很好办,但是其他两种怎么办呢? 我们回顾$kruskal$的算法思想,他的核心就是贪心,每次选最小的边加入,那么我们是否可以改变一下白边的优先级,让他每次加入的白边数恰好为$n 阅读全文
posted @ 2020-07-22 14:15 草鱼泡酒 阅读(150) 评论(0) 推荐(0)
摘要:一道最小生成树模板题,这里用的Kruskal算法,把每两点就加一条边,跑一遍最小生成树即可。 #include <bits/stdc++.h> using namespace std; struct node{ int l , r , w; }; node e[4000010]; int n , m 阅读全文
posted @ 2020-06-29 15:42 草鱼泡酒 阅读(168) 评论(0) 推荐(0)
摘要:这道题也就是一个在线的最小生成树(虽然可以转化为离线但是懒嘛),因为给的是边,那么就是Kruskal算法了。由于在求解中需要排序,而因为序列本身是有序时插入一个数据,那么我们就可以直接用插入排序的思想做。 代码: #include <bits/stdc++.h> using namespace st 阅读全文
posted @ 2020-06-28 20:39 草鱼泡酒 阅读(114) 评论(0) 推荐(0)
摘要:这道题其实就是无线通讯网的双倍经验啦,只是在输出的时候不同罢了。还是一样的$kruskal$算法,但是在求的时候,应该在$now=n-k+1$的时候结束。本来到$n-k$就行了的,但是由于$n-k+1$这条边是在应该部落里面的,不能算,所以要找到第一个不在一个部落里面的边。 代码: #include 阅读全文
posted @ 2020-06-26 16:01 草鱼泡酒 阅读(93) 评论(0) 推荐(0)
摘要:这道题其实就是转化一个模型就可以了。 买了一个另外一个又优惠,其实就相当于在优惠的时候连一条边,因为不可能多买,所以就是建一棵最小生成树。最后因为肯定买了一件物品,要加上最初的单价。 代码: #include <bits/stdc++.h> using namespace std; struct n 阅读全文
posted @ 2020-06-24 15:39 草鱼泡酒 阅读(109) 评论(0) 推荐(0)
摘要:这道题找到关键点那就是模板题了,代码好写哒~ 因为有S个电话,两个电话就可以连通两个块,那是不是我们就可以看做一条无消耗的边,提前连了起来。根据Kruskal的思想,我们每次加入最小的边,直到联通,由于两台电话一条线,所以我们加入的点也就只需要P-S条了,相当于贪心掉了最大需要的边。 O泡代码时间到 阅读全文
posted @ 2020-06-24 15:22 草鱼泡酒 阅读(143) 评论(0) 推荐(0)
摘要:这道题大致题意就是让一棵树任意两点有连边(也就是完全图),但是补完后最小生成树是一开始的那棵树,问最小加的边权之和是多少。 了解题意后,我们可以想到用Kruskal(废话),当每两个集合合并的时候,除了本身的那条边,一共还会加上$siz_i * siz_j - 1$条边,那么每条边的大小也就是边$i 阅读全文
posted @ 2020-06-23 17:46 草鱼泡酒 阅读(58) 评论(0) 推荐(0)