最小生成树
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj1232 [Usaco2008Nov]安慰奶牛cheer(kruskal)
对树dfs的性质是,遍历过程中每条边会被访问两次,点访问次数为度数,起点再多一次。 于是我们把遍历的过程每条边分开考虑。 每一条边对答案的贡献为边权*2+两点的点权。 按新权求一棵最小生成树再加上最小点权(作为起点访问)即可。原创 2017-09-26 13:30:01 · 324 阅读 · 0 评论 -
bzoj3545 [ONTAK2010]Peaks(离线+kruskal+主席树+线段树合并)
首先我们可以离线做。把询问按x排序,给每个点建一棵权值线段树。然后一边跑mst,一边维护线段树。每次合并两个点的时候,就要合并两棵线段树。合并的时候要小心因为合并叶子时不能pushup,所以还是每次相加比较稳妥。然后合并的总复杂度应该就是合并时删掉的节点数,是O(nlogn)的,可以接受。所以总复杂度O(nlogn+mlogm原创 2017-12-03 21:12:56 · 351 阅读 · 0 评论 -
bzoj3551 [ONTAK2010]Peaks加强版(kruskal重构树+dfs序+主席树+树上倍增)
题意同bzoj3545,只不过强制在线了。那强制在线了怎么搞呢x,有一个神奇的东西,kruskal重构树,张这个样子:传送门。他有很多优美的性质:首先,他一定是一颗二叉树,然后所有叶子节点一定是原图中的点,从叶子节点往跟走,点权一定是单调不降的。如果原图中有n个点,则这棵树一定有n+n-1个点(因为你需要合并n-1次,也就新建了n-1个点)。然后对于这道题而言,你可以从v开始在树上倍增找到第一个小于原创 2017-12-04 19:31:04 · 447 阅读 · 0 评论 -
poj3552 Slim Span(暴力+kruskal)
这题就是求一个最小生成树,最小生成树的定义为最大边-最小边最小。我们可以直接暴力的枚举最小边,然后做最小生成树。原创 2017-12-16 20:42:05 · 374 阅读 · 0 评论 -
uvalive6837 There is No Alternative(暴力+kruskal)
一句话题意:求在原图的所有最小生成树中均出现的边。 orz Elijahqi直接秒掉此题。 先做出一颗最小生成树,然后枚举每一条生成树中的边,删掉它,看还能不能做出最小生成树。O(nm)原创 2017-12-17 11:43:29 · 305 阅读 · 0 评论 -
bzoj2561 最小生成树(最小生成树+最小割)
首先考虑让L出现在最小生成树中。则边权比L小的所有边不能使得u,v联通。否则加入L,在环上一定是去掉L最优。所以跑个最小割就是答案。最大生成树同理,两个答案相加就是答案。原创 2017-12-28 09:32:33 · 377 阅读 · 0 评论 -
bzoj3058 四叶草魔杖(状压dp+最小生成树)
正解是最小生成树+状压dp。暴力的求出每个集合的和,若为0,则对这个集合做最小生成树,它的mst就是使得这个集合的点都合法的代价。然后如果s1,s2两个集合不重复,且都可以合法,则s1与s2的并集也可以由他俩的代价和实现合法,状压转移一下取最小值即可。(我本以为这样的转移会T,但是想一想常数应该极小。)原创 2018-01-13 20:53:09 · 408 阅读 · 0 评论 -
poj1639 Picnic Planning(度限制最小生成树)
给定最多20个点的无向图,要求1号点度不能超过k,让你求出它的最小生成树。 大概思路就是先把与1号点相连的边忽略,原图分成若干个连通块,假设分成了m个块,在每个连通块内求最小生成树。现在1号点的度至少为m,因此显然如果m>k是无解的。我们现在把这些连通块用m条1出发的边连起来,我们每一块选一条最小的边去连。现在我们就得了m度限制最小生成树。我们还可以把m度限制变成m+1…k限制,选一个最小的即可。原创 2018-01-10 17:12:25 · 379 阅读 · 0 评论 -
bzoj2594 [Wc2006]水管局长数据加强版(lct+kruskal+离线)
考虑离线操作,倒着做,就是维护不断往里加边的最小生成树。具体做法与魔法森林差不多。 至于如何找到一条边的标号,可以二分查找来做。原创 2018-03-07 11:31:47 · 259 阅读 · 0 评论 -
CF603E Pastoral Oddities(lct维护虚边信息+set+kruskal)
题目大意:动态加边,定义合法边集为使得每个点度数均为奇数。边集的代价为权值最大的边的权值。每次加入一条边后问现在合法边集的最小代价。我们首先要发现一个结论:当且仅当一个连通图的点数为偶数时,存在合法边集。具体证明见官方题解。于是合法边集的判定标准现在变成了是否不存在奇数个点的连通块。如果给定一张图,我们怎么做呢?类似kruskal的做法,把边按权值从小到大排序,一直加边直到不存在奇数个点的连通块为止原创 2018-03-09 14:19:37 · 528 阅读 · 0 评论 -
bzoj2395 [Balkan2011]Timeismoney(Kruskal+计算几何)
最小乘积生成树。我们把每棵生成树看做二维平面上的一个点(x,y),x坐标为边权1的和,y坐标为边权2的和。那么我们就是试图找到一个点,使得过它的双曲线最靠近坐标轴。我们不难证明,这样的点一定是在下凸壳上的。于是我们现在就是要找出所有在下凸壳上的点,用他们的x*y来更新答案。我们先找出最接近x轴和最接近y轴的两个点A,B(即一维上的MST),然后考虑在AB靠近原点一侧找一点C,使得离AB最远,即最大化原创 2018-03-30 10:08:00 · 232 阅读 · 0 评论 -
bzoj3754 Tree之最小方差树(枚举+Kruskal)
求最小方差树。只好枚举平均数。求出可能的最小边权和和最大边权和,然后枚举边权和,做Kruskal更新答案。因为f(x)=∑i=1n(ai−x)2f(x)=\sum\limits_{i=1}^n(a_i-x)^2,当x=a¯x=\overline a时f(x)取得最小值,所以如果当前方案不合法也没关系,一定会在合法时更新为更小的。复杂度O(n∗C∗mlogm)O(n*C*mlogm)其实我觉得这样复杂原创 2018-03-30 10:56:26 · 302 阅读 · 0 评论 -
uoj236 【IOI2016】railroad(欧拉图+最小生成树)
首先我们对每一个速度建一个点,然后对于每一个路段(s,t),建边s->t。这样我们就是求可以在这张图中添加一些边,要求经过每条边恰好一次。我们添加一条(inf,1)的边,这样就是要求把这张图变成欧拉图。考虑这样一个区间[x,x+1][x,x+1][x,x+1] , 只有满足s≤x,t≥x+1s≤x,t≥x+1s≤x,t≥x+1的边与满足t≤x,s≥x+1t≤x,s≥x+1t≤x,s≥...原创 2018-06-20 21:54:13 · 892 阅读 · 0 评论 -
NOIP模拟10.26
Poetize11 A.rainbow. 挂精度了。30。思路好像也有点问题·。。。正解是二分答案,通过勾股定理求出每个半圆能够覆盖的线段。此时问题转化为线段覆盖问题,排序扫描一遍即可。(直接拿圆判可能会有特例?) B.clover。状压dp+dfs瞎搞。。70. C.fin。dp打表了AC hh。实质上可以根据这道题的特性,把dp优化下,简直黑科技。处理出深度为d时,可能的最大节点数和最小节原创 2017-10-26 16:28:31 · 369 阅读 · 0 评论 -
bzoj1196 [HNOI2006]公路修建问题(二分答案+kruskal/贪心)
最大值最小,二分答案一波,然后去判定,优先选择一级公路,再选二级公路。贪心想不清楚,好像也能做。原创 2017-11-09 17:23:00 · 351 阅读 · 0 评论 -
bzoj3390 [Usaco2004 Dec]Bad Cowtractors牛的报复(最大生成树)
最大生成树,和最小基本一样。原创 2017-09-26 13:59:51 · 351 阅读 · 0 评论 -
bzoj1977 [BeiJing2010]次小生成树 Tree(kruskal+树上倍增)
先求出最小生成树,注意要严格次小。。。 枚举每一条非树边,把他加进来然后删掉这条非树边连接的两点在树上原来的路径上的最大边(保证是次小),(如果最大边与非树边边权相同则找次大边,为了严格次小)然后更新最小增量。 最大边和次大边可以通过树上倍增求出原创 2017-09-26 20:21:37 · 363 阅读 · 0 评论 -
bzoj1016 [JSOI2008]最小生成树计数(kruskal+dfs+乘法原理)
首先需要一个结论,对于一个图的不同最小生成树,每种方案所包含的每种权值的边的数量一定一致。换句话说,把每种方案包含的所有边的边权都写下来,写出来的序列一定都一样。关于这个结论的说明放在最后。 这样的话,可以先做一遍kruskal,记下每种边权的使用次数,然后对于每种边权进行dfs,判断有多少种合法的组合方式【一种方案合法意味着:1.加入每条边时,边的两端点一定属于不同的并查集,也就是仍然要符合k原创 2017-09-27 22:46:04 · 342 阅读 · 0 评论 -
bzoj2429 [HAOI2006]聪明的猴子(prim)
就是求最大边最小,就是最小生成树,prim应该更快些原创 2017-09-28 08:34:20 · 350 阅读 · 0 评论 -
bzoj1626 [Usaco2007 Dec]Building Roads 修建道路(kruskal裸题)
kruskal裸题原创 2017-09-28 08:58:12 · 626 阅读 · 0 评论 -
bzoj1682 [Usaco2005 Mar]Out of Hay 干草危机(kruskal裸题)
最大边最小,就是最小生成树裸题原创 2017-09-28 09:12:14 · 452 阅读 · 0 评论 -
bzoj2654 tree(kruskal+二分)
orz clj orz clj orz clj 要求恰有ned条白边的最小生成树。我们发现,给所有白边的权值加上一个正数后,mst中白边的个数是单调不增的。因此我们可以二分给所有白边加上一个值,然后去做最小生成树,统计白边个数,若多于ned,则权值应该再加大,若少于ned,则权值应该再减小。 但是有一个很重要的细节:万一我二分x时,白边个数大于ned,但二分x+1时,却小于ned,也就是说不原创 2017-09-28 12:38:06 · 311 阅读 · 0 评论 -
bzoj3479 [Usaco2014 Mar]Watering the Fields(prim裸题)
prim,O(n^2)求最小生成树。每次贪心的把最小边加进去。原创 2017-09-21 10:53:36 · 361 阅读 · 0 评论 -
bzoj1083 [SCOI2005]繁忙的都市(kruskal裸题)
kruskal求最小生成树,先把边按边权排序,然后从小到大,每次合并两个节点,如果不在一连联通块上,那么这条边就是我们要统计的边,用并查集维护,总复杂度O(ElogE)原创 2017-09-21 11:21:13 · 359 阅读 · 0 评论 -
bzoj1601 [Usaco2008 Oct]灌水(prim)
直接做不太好做,我们搞一个超级源点,让它向每一个点建一条权值为w的边,然后我们求最小生成树即可。这样可以保证至少有一个点我们建了水库。而且所有点连通。原创 2017-09-21 12:48:49 · 312 阅读 · 0 评论 -
bzoj3206 [Apio2013]道路费用(kruskal+并查集+状压枚举+dfs)
我们先优先的把k条指定边加入到生成树中。这时候生成树中的非指定边是必选的,无论在那种方案中。因此我们先把这些点缩成一个点,这样,我们最多剩下了k+1个点。(把图中的边清空,加入必选边,连通块缩成点,这样我们会得到一个点数不超过 K + 1 的图,令此图为新图(注意,新图中不包含任何边,只有那至多 K + 1 个点))同时 m 条边中必选边之外的边如果放在新图中会有很多重边,将这些重边合并,于是压缩成原创 2017-09-29 16:42:26 · 386 阅读 · 0 评论 -
poj2728 Desert King(最优比率生成树,二分答案+prim)
最优比率生成树,就是01规划问题,可以用二分答案来解决。最后答案可以表示成∑iw[i]∑id[i]\frac{\sum\limits_i w[i]}{\sum\limits_id[i]},我们二分答案,如果∑iw[i]∑id[i]<mid\frac{\sum\limits_i w[i]}{\sum\limits_id[i]}<mid, 则∑iw[i]<∑id[i]∗mid\sum\limits_i原创 2017-09-30 10:22:22 · 345 阅读 · 0 评论 -
bzoj4793 [CERC2016]Hangar Hurdles(bfs+最大生成树+贪心)
首先我们可以预处理出以每一个格子为中心的最大正方形边长。 (以每一个障碍为起点,跑八联通bfs即可) 那么能从x点挪到y点的最大正方形边长就是两点间路径最小值的最大值。 也就是求一个最大瓶颈边,我们想到了最大生成树。 不过这个是点权的,处理起来比较奇怪qaq 我们按点权从大到小处理每一个点,和这个点周围的四个点,如果已经加进去了,就连起来。钦定父亲节点权值小于儿子节点,维护这棵最大生成树...原创 2018-06-22 10:09:19 · 599 阅读 · 0 评论