![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
最小生成树
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj1601[Usaco2008 Oct]灌水
DescriptionFarmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记。把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库。 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij(1<=pij<=100000,pij=pji,pii=0). 计算Farmer John所需的最少代价。Input*第一行:一个数原创 2017-03-02 21:54:47 · 277 阅读 · 0 评论 -
bzoj1006 最小生成树计数
分析:我们可以先做一遍kruskal,得出每种权值使用的数量,然后用权值相同的边去替代,用乘法原理去算就可以了。#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b原创 2017-03-05 08:32:56 · 209 阅读 · 0 评论 -
bzoj1682
直接最小生成树。。一开始看错题目了。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m;ty原创 2017-03-07 17:04:54 · 183 阅读 · 0 评论 -
bzoj3390
分析:直接最大生成树就好了。。至于-1的情况。。 只要没有选出n-1条边都算错。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=原创 2017-03-10 21:56:24 · 213 阅读 · 0 评论 -
bzoj3943[Usaco2015 Feb]SuperBull
分析:这题是真的不错。。我想了半天根本就没往生成树方面想。。倒是想到连边,但是以为直接排序以后取最大就可以了,发现顺序好像也会影响。因为每走一条边就要去掉一个点,这不是裸的最大生成树么。。看来以后还是要把题目模型进一步化简。。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a原创 2017-03-13 20:51:25 · 266 阅读 · 0 评论 -
bzoj4973比特战争 kruskal
Description在比特世界,A国正与B国爆发着战争!B国有n个城市,编号依次为1到n。这些城市之间通过m条双向道路连接,其 中第i条道路连接着u_i,v_i这两个城市。任意两个城市之间可能有多条道路,也有可能从1号点出发不能到达所有 城市。对于第i个城市,占领这座城市则需要在这里聚集a_i个特种兵,而在这里空降1个特种兵的代价为b_i。对于 第i条道路,占领这条道路需要在道路两端点的城市原创 2017-08-24 22:00:40 · 379 阅读 · 0 评论 -
51nod 1601 完全图的最小生成树计数 Trie+kruskal
题意:给定一个长度为n的数组a[1..n],有一幅完全图,满足(u,v)的边权为a[u] xor a[v] 求边权和最小的生成树,你需要输出边权和还有方案数对1e9+7取模的值。由于边权是xor得到,容易想到用trie统计。。 按照当前最高位0/1将当前区间内的点分成两个部分s/t,那么答案肯定是s的最小生成树+t的最小生成树+s-t的最小边,s-t最小边用trie统计,最小生成树递归处理。原创 2017-09-08 21:31:36 · 1638 阅读 · 0 评论 -
bzoj1977 [BeiJing2010组队]次小生成树 倍增
标准的次小生成树(严格次小) 先想想不严格怎么做(好像都差不多) 枚举每一条边来更新,这是n^2算法。 然后这题的话我们对于每一个点,预处理,倍增一下求他到他的第2^j个父亲所经过的边的最大值和次大值。 然后我们先求出最小生成树,然后对于最小生成树上相邻两个点之间所有边,记录最大值和所选的边的差,如果最大值和原来的边相等就换成次大值,最后答案就是最小生成树+最小差值。#include<cst原创 2017-09-12 18:36:29 · 194 阅读 · 0 评论 -
JZOJ5401. 【NOIP2017提高A组模拟10.8】Star Way To Heaven prim求mst
whx大爷的题目怎么搞都能虐我= = 比赛的时候以为是神题然后没把时间放在上面,失策= = 其实并不难。(为什么你们都做过拯救小云公主那题啊。。) 假设我们的答案为ans,那么对于每一个点画一个半径为ans的圆,如果能从左走到右不经过圆那么ans就是成立的。 这样看来好像二分答案就可以了,然而n<=6000,带个log会被卡。 事实上,我们只要对于n个点的完全图,做mst,然后找出里面最大原创 2017-10-09 12:40:25 · 831 阅读 · 0 评论