生成树
sunyutian1998
这个作者很懒,什么都没留下…
展开
-
旅行comf HYSBZ - 1050
https://www.lydsy.com/JudgeOnline/problem.php?id=1050最小生成树变形 没想到.. 一开始想的枚举最小二分最大 但是这些边无法确定走不走枚举每条边作为最小值 然后用所有大于等于该值的边跑最小生成树 当起点终点连通时就退出 这样第一和最后一条被选中的边就是最小和最大边 #include <cstdio>#inc...原创 2018-07-17 20:36:23 · 232 阅读 · 0 评论 -
Clarke and MST HDU - 5627
http://acm.hdu.edu.cn/showproblem.php?pid=5627要求一棵且运算结果最大的SPT 肯定不能简单按权值排序贪心考虑 枚举二进制位 如果2^i可以被满足 完全可以牺牲掉2^(i-1)2^(i-2)...枚举到2^i时 从目前所有边中找出边权的二进制位中i位为1的边 看能否将图连通 能的话就把低位的范围限定在所有边权的二进制位中i位为1的边中 若不...原创 2019-03-27 18:06:36 · 179 阅读 · 0 评论 -
Pseudoforest HDU - 3367
http://acm.hdu.edu.cn/showproblem.php?pid=3367一开始想当然地求最大生成树然后再加边 WA。。 看题解就是把克鲁斯卡尔的判连通再加上判环就好 这样还是符合原算法的贪心策略的 #include <bits/stdc++.h>using namespace std;const int maxn=1e5+10;const int...原创 2018-10-26 12:06:32 · 146 阅读 · 0 评论 -
Imperial roads Gym - 101889I
http://codeforces.com/gym/101889/attachments给一个图 q次询问 在某条边必选的条件下求一个最小生成树先求个生成树 因为每次只固定一条边 可以求个lca 看替换形成的圈上的哪条边最合适对一个最小生成树后 如果用两点之间的非树边替换一条树边构成新的生成树 肯定不是最优的(排除相等) 所以在只替换一条边的情况下只考虑圈内边即可 #inclu...原创 2018-10-18 13:27:53 · 163 阅读 · 0 评论 -
Love Rescue CodeForces - 939D
http://codeforces.com/contest/939/problem/D每次可以找一个字母对 (c1,c1) 以后这两个字符就可以随便相互转换 用最少的对数将两个字符串变得一样 且这些转换具有传递性其实可以看做一个最小生成树 如果两字符串对应位置不相等 就当作在图上 有两个字符对应的点 两点之间有一条边 因为有传递性 所以我们要的就是用最小代价将图连通#include ...原创 2018-09-06 13:57:40 · 201 阅读 · 0 评论 -
Envy CodeForces - 892E
http://codeforces.com/problemset/problem/892/E看着别人题解写的 算是学了一波可撤销并查集结论 对于一条权值为w的边来说 如果在所有权值小于w的边全部加入图后这条边的两个端点还没有联通的话 那么这条边能出现在最小生成树中对于单组询问来说 可以根据上述结论来判断 这里的多组询问可以离线处理 不太好处理的就是权值相同的边 首先按权值其次是查询的下...原创 2018-09-10 01:17:10 · 245 阅读 · 0 评论 -
Maze Designer 计蒜客
https://nanti.jisuanke.com/t/31462题目说两点之间路径唯一 那就是一棵树 又因为树的补图权值之和要最小 那其实就是求一个最大生成树然后每次查询求个lca即可#include <bits/stdc++.h>using namespace std;#define ll long longstruct node1{ int u;...原创 2018-09-09 19:11:59 · 172 阅读 · 0 评论 -
Count The Pairs HDU - 4750
点击打开链接以前的一道题目 想起来又做了一遍 当时真的是毫无头绪 看了博客还是半懂不懂现在独立思考已经可以有比较清晰地思路 也可能是因为做过类似的题目吧题目所说的两点间f值即是 两点间所有路径中最长边的最小值 用最小生成树解决先将边升序排序 这样当前遍历到的每一条边都是最长的 这个性质非常好假设当前遍历到的边的两个点之前是不连通的 这样在两点间路径中的最长边(f值)就确定是当前...原创 2017-08-03 14:29:50 · 236 阅读 · 0 评论 -
天气晴朗的魔法 51Nod - 1640
点击打开链接两种解法一:二分最长边 求最大生成树 #include <bits/stdc++.h>using namespace std;#define ll long longstruct node{ int u; int v; ll w;};node edge[200010];ll len[200010];ll an...原创 2017-08-06 20:23:42 · 262 阅读 · 0 评论 -
Truck History POJ - 1789
点击打开链接这道题一开始纠结于谁才是祖先 想到最短路上去了.. 其实与祖先是谁无关 与两点之间谁衍生出谁亦无关 因为在一颗树中谁当根节点不都一样吗其实就是从n(n-1)/2条边的完全图中找最小生成树 两种类型之间的差异度就是两点之间边的权值 #include <stdio.h>#include <algorithm>using namespace st...原创 2017-08-06 21:01:48 · 300 阅读 · 0 评论 -
Conscription POJ - 3723
点击打开链接虽是二分图 但在此题中男女其实可以看做同一类型 都是点与点之间的关系两人之间的关系价值就是边长 用这些边凑最大生成树(边长就是优惠值 优惠越多越好) 虽然有可能不是一颗完整的生成树个人感觉题意中比较难理解的就是 "Notice that only one relationship can be used when collecting one soldier."一开始觉...原创 2017-08-06 21:40:15 · 237 阅读 · 0 评论 -
Fibonacci Tree HDU - 4786
点击打开链接对生成树一些相关概念还是不清楚 学好离散数学很重要的分别求最小和最大生成树 其值分别代表最少和最多可以用多少条白边构造生成树既然上下界都已确定 那这个区间内的边数都是可以被满足的 #include <bits/stdc++.h>using namespace std;struct node{ int u; int v; ...原创 2017-11-25 10:27:08 · 190 阅读 · 0 评论 -
Desert King POJ - 2728
点击打开链接最优比率生成树 用的二分法 Dinkelbach就先留坑吧推荐博客点击打开链接通过构造函数F(L)=sigma(d[i]*x[i]) 其中d[i]=a[i]-L*b[i]我们可以知道当前的L取值是否符合条件 是否是最优解 再结合d[i]是关于L的一元单调函数 所以可以用二分法解决 #include <stdio.h>#include <...原创 2017-11-25 15:19:23 · 266 阅读 · 0 评论 -
Save your cats Aizu - 2224
点击打开链接题意大致是 给一些点和一些边 问怎么样用最小的代价 去掉一些边 来使图中无回路求最大生成树即可 生成树以外的边之和即位所求记得离散数学里是这么说的 对树上任意两点加一条边就会构成圈 所以使图只剩一颗树(当然图本身也可能不连通)就是我们的目标 #include <bits/stdc++.h>using namespace std;struct no...原创 2017-12-03 18:27:29 · 265 阅读 · 0 评论 -
城市建设 蓝桥真题
最小生成树变形 变在怎么处理码头 显然不能两码头的建设费用作为一条边 可以建立一个虚点 将点的码头建设费用作为边权与其相连但是虚点也是点 如果需要走水路那图中就有 (n+1)个点 不需要的话还是n个点 此处要分类讨论1. 所有城市可以通过陆路相连此时可能只走陆路花费少 走水路反而费钱 先对这n个点求最小生成树也可能需要水路松弛 那就再求(n+1)个点的最小生成树两者取最小...原创 2018-03-09 14:51:14 · 220 阅读 · 0 评论 -
安慰奶牛 蓝桥真题
这个题关键在于怎么处理这些点需要重复到达的问题 题目要求最后只剩一个树图 即只留(n-1)条边 我们把每条边的边权乘二 再加上左右两节点的点权 作为新的边权 然后套克鲁斯卡尔 最后加上一个最小的点权 1. 边权乘二那么对于每一条边edge[i] 它都连接了以左节点edge[i].u为根的子树(左树)和以右节点edge[i].v为根的子树(右树) 而题目要求最后必须回到...原创 2018-03-18 12:29:25 · 279 阅读 · 2 评论 -
Minimum spanning tree for each edge CodeForces - 609E
点击打开链接先求最小生成树的边 这些边的对应值就是生成树的权值 再用这些边建图 对所有非生成树上的边的两点 去掉两者路径上的最长边 然后换为当前边的权值 这个过程求个lca即可这应该是贪心 最小生成树已经是最优解(克鲁斯卡尔方法中 就是从小边找起 感觉也有贪心的意思) 每换下任何一条边都会增加权重(可能不变) 既然非要换至少一条边 那就只换一条就够了#include <bits...原创 2018-03-23 09:39:37 · 202 阅读 · 0 评论 -
Destroy Walls HDU - 6187
http://acm.hdu.edu.cn/showproblem.php?pid=6187首先 如果要保证任意一点都可到达 那由塔和墙构成的这张图必须是个森林 即不能存在环 因为有环必有封闭区域那既然已经是森林了 出发点的位置已经没有任何意义了 n个塔的位置也是一样的现在问题就是怎么用最小代价将图变为森林 首先边数是固定的 对于权值 要使拿掉的权值最小 等于使剩下的权值最大 即最大生...原创 2019-04-11 08:59:44 · 138 阅读 · 0 评论