最小生成树
最小生成树问题
Lesords
这个作者很懒,什么都没留下…
展开
-
洛谷 P4047 [JSOI2010]部落划分 (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P4047题解: 首先计算所有野人之间的距离由于这些野人分成了k个部落,那么可以理解为将一颗生成树分成k个部分由于一颗n个点的生成树需要连接 n-1 条边将生成树分成k个部分需要扣除 k-1 条边将野人当成一个点,所以对这些点需要连接 (n-1) - (k-1) = n-k 条边即可由于题目需要求的是 两个部落之间的最小距离那么这个最小距离即为我们分割时的最小边,即为最小生成树中 n-k+1 小的边也就是说,我们选原创 2021-07-30 21:24:51 · 321 阅读 · 0 评论 -
洛谷 P1991 无线通讯网 (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P1991题解: 由于卫星电话之间的距离为0,所以远的优先用卫星电话那么对于本题而言,可以理解成将一个生成树分成若干个部分每个部分都有一个卫星电话,所以可以在生成树中把最长的几个边分割掉对于s个卫星电话,则可以分割s-1条边(将s-1条设为0)对于p个哨所,则需要连接p-1条边所以对于生成树来说只需要取 (p-1)-(s-1) 条边即先计算所有哨所之间的距离,然后对原图做Kruskal算法,取(p-1)-(s-1)条原创 2021-07-30 20:54:00 · 317 阅读 · 0 评论 -
洛谷 P1195 口袋的天空 (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P1195题解: 由于需要有k个棉花糖,则可理解为将云朵分成k个生成树。特判棉花糖大于云朵的数量,此时无解。那么对于一个生成树来说,点为n个,边则有n-1条。如果要想分割成k个生成树,需要减去(k-1)条边即所需要的边为:(n-1)-(k-1) = n-k也就是对原图进行Kruskal且只连接 n-k 条较小边即可代码及注释如下:#include<iostream>#include<algorit原创 2021-07-30 20:44:54 · 432 阅读 · 0 评论 -
洛谷 P1194 买礼物 (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P1194题解: 由于所有东西的价格都为a,并且买个第I个,再买第J个只需要话Kij。那么可以建立最小生成树,连接所有的边,然后再加个起点的值即可需要注意的是: 优惠不一定比原价便宜!!!代码及注释如下:#include<iostream>#include<set>#include<algorithm>using namespace std;const int MAXN = 50原创 2021-07-30 20:36:10 · 1116 阅读 · 1 评论 -
洛谷 P2121 拆地毯 (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P1396**题解:**题目中的地毯其实就相当于一条边。则可以理解为计算只有k条边的最大生成树。计算最大生成树的话,边排序的时候从大到小排序即可。在选择边的时候记录边的数量,已选择k条则直接结束代码及注释如下:#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int MAX原创 2021-07-30 20:26:10 · 341 阅读 · 0 评论 -
洛谷 P1396 营救 (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P1396题解: 由于求得是s到t道路中最大的边权值(尽量最小),那么可以利用Kruskal建生成树,如果当前边连接之后s与t联通,那么当前边的边权即为结果(因为Kruskal的边权是从小到大选的)代码及注释如下:#include<iostream>#include<algorithm>using namespace std;const int MAXN = 2e4+5;struct node原创 2021-07-30 20:21:34 · 597 阅读 · 0 评论 -
洛谷 P2872 [USACO07DEC]Building Roads S (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P2872**题解:**先计算所有点之间的距离,然后将所有给定边的边权值设为0。然后进行Kruskal算法即可。代码及注释如下:#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<algorithm>#define原创 2021-07-30 20:15:58 · 313 阅读 · 0 评论 -
洛谷 P3366 【模板】最小生成树 (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P3366题解:利用Kruskal算法求解,这里大致说下Kruskal算法。对于一个点数为n的生成树而言。很显然,想要成为一个生成树。那么肯定需要n-1条边。不能多也不能少,多了会有环,少了会不连通。Kruskal算法的做法是:将所有边按照边权值(边的长度等)从小到大排序,每次选择一个边,并且这条边所连接的两个点在还没选择这条边的时候尚未连通,也就是说选了这条边之后不会有环,那么累加这条边的边权值,直到所有边都判断结束。注原创 2021-07-30 20:02:01 · 614 阅读 · 0 评论