图论
文章平均质量分 59
616156
赛高______↑
展开
-
【总结】最小树形图 朱刘算法
前言省选复习的时候,发现没写博客。。。来补一篇。。最小树形图就是有向图的最小生成树,满足从根出发,能到达所有节点,且边权和尽可能小。朱刘算法很暴力的方法,每个点在指向它的边中,选择最小的一条(根节点不选)。然后答案加上每个点选出的边权。然后可能有环,就缩环成点,然后改一下边权val’-=val,表示之后若选择val’,则必须断开val一直这样做下去,直到某一次找不到环了就停止...原创 2019-04-04 15:13:34 · 663 阅读 · 0 评论 -
【图论】【DFS】AGC005E Sugigma: The Showdown
分析:实在不知道有什么难点的题。。。一个人要跑,一个人要追,显然追的人是不会停下的,所以最终答案要么是-1,要么是追的人走的步数*2.根据样例,很容易发现,追不到的情况只有一种:跑的人到了一条边上,然而追的人在这两个端点的距离大于2,此时跑的人就可以通过秦王走位(来回鬼畜),让追的人永远追不上。那么就很简单了,建两棵树,一颗以x为根,一颗以y为根,然后从x出发dfs,走到每个点,先检查追的...原创 2018-09-20 16:53:30 · 298 阅读 · 0 评论 -
【图论】AGC010C Cleaning
分析:以任意一个叶子结点为根,然后对每个点,考虑其会向上贡献多少条路径,顺便统计是否合法。详见代码#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#define SF scanf#define PF pri...原创 2018-09-25 16:28:42 · 267 阅读 · 0 评论 -
【图论】【思维题】AGC004F Namori
分析:比较复杂的一道思维题。。。先考虑树的情况,把所有点按照深度的奇偶性分为两类,在所有深度为奇的点放一个“+1”,在所有深度为偶的点放一个“-1”。这样一来,每次染色,就可以看作交换了一对相邻的“+1”和“-1”。目标状态就是所有的“+1”移动到“-1”所在的位置,所有的“-1”移动到“+1”所在的位置(即染色次数为奇数)。然后所有"+1"和“-1”两两配对一定是最优的,并且,把配对的两个...原创 2018-09-19 20:29:32 · 313 阅读 · 0 评论 -
【数学】【图论】【DP】AGC009E Eternal Average
分析:首先要转换为一棵K度树,有N个权为0的叶子节点,有M个权位1的叶子结点。每个非叶子节点的权值为其所有儿子的权值的平均值。那么设1的点的深度分别为a1,a2,a3……ama_1,a_2,a_3……a_ma1,a2,a3……am0的点深度分别为b1,b2,b3……bnb_1,b_2,b_3……b_nb1,b2,b3……bn那么由于其是一颗K度树,所以必须满足:∑k−ai...原创 2018-09-24 21:17:20 · 183 阅读 · 0 评论 -
【图论】AGC009D Uninity
分析:首先,点分治的姿势告诉我们,这题答案的上限是log(n)log(n)log(n),但显然这不是最优解。但我们可以借助点分治得到一个结论:设每个点在点分治树中的深度为kik_iki,那么对于任意两个深度相同的点,它们的路径上,深度最大的点一定大于kik_iki。(就是第一次把它们分成两块的重心点)有了这个性质,我们可以得到一个优秀的贪心算法:对每个点x,考虑对它进行标号:如果在...原创 2018-09-24 20:44:30 · 424 阅读 · 0 评论 -
【图论】AGC027C ABland Yard
分析:再现C比B简单。。。。(然而被B卡了,DP大失败。。)其实我觉得这题的出题人有点偷懒。。。正解是9月2日的CF中的E题简化版这两道题的本质就是: 合法性互相嵌套的问题(即:A的合法性需要B保证,同时B的合法性又需要A保证)。说具体一点,在这题中,很显然我们需要找一个环,环上的每个点两侧的点分别为’A’,‘B’。 换言之:我们需要找一个点双联通分量,其中每个点相邻的点中至少...原创 2018-09-16 11:09:55 · 329 阅读 · 0 评论 -
【图论】【LCA】NOIP2016 天天爱跑步
分析:诶。。再次觉得两年前的自己是个智障。。这题虽然号称全场最难。。但其实O(nlogn)O(nlogn)O(nlogn)算法还是挺好想的(我太菜了想不出O(n)O(n)O(n)算法)无非就是LCA随便搞搞。。。对于每个跑步的人,把它拆分为2个,一个从u出发,只往上跑,时间递增,跑到lca(u,v)lca(u,v)lca(u,v)为止。一个从v出发,只往上跑,时间递减(出发时间为dist(...原创 2018-09-12 10:48:01 · 242 阅读 · 0 评论 -
【图论】Codeforces Manthan Codefest18E Trips
分析:肥肠简单但却很容易想岔的题、、、(就是那种想清楚过后觉得水得不行,然而却想了半个小时的题)首先,这题第一个坑,就是在线/离线因为每次边是一条一条加的,这非常类似一些数据结构的特色(单一修改),所以很容易就去想在线怎么做。。。。然而我想了至少20分钟还是没个优秀的算法。。。所以就不得不考虑离线首先要提及一点:这个题说要去的人数最大化,但其实每个人之间并没有矛盾关系,所以只要能去...原创 2018-09-03 12:07:59 · 225 阅读 · 0 评论 -
【NTT】【数论】【图论】AGC005F Many Easy Problems
分析:这题最恶心的一点就在开头:首先,在树上,联通块大小为边的大小+1,所以可以算边的贡献:对每条边而言,如果它能造成贡献,那么必然在它两端都有选中的点,设选k个点,那么方案数就是C(n,k)−C(suma,k)−C(sumb,k)C(n,k)-C(sum_a,k)-C(sum_b,k)C(n,k)−C(suma,k)−C(sumb,k),suma,sumbsum_a,sum_bsuma...原创 2018-09-20 17:21:54 · 187 阅读 · 0 评论 -
【分析】AGC005 Tree Restoring
分析:非常简单的水题根据树的直径的性质(每个点的最远点为直径的某一端点)1、min{ai}=⌊max{ai}+12⌋min\{a_i\}=\lfloor \frac {max\{a_i\}+1} {2}\rfloormin{ai}=⌊2max{ai}+1⌋2、除了min{ai}min\{a_i\}min{ai},其余所有数必须出现至少2次。3、当max{ai}max\{a_i\}...原创 2018-09-20 18:32:27 · 314 阅读 · 1 评论 -
【圆方树】BZOJ3331 压力
题目:分析:圆方树板子题建出圆方树后,直接树上差分即可#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#define SF scanf#define PF printf#define MAXN 400010using namespace s...原创 2019-03-25 11:50:34 · 208 阅读 · 0 评论 -
【数论】【矩阵树定理】BZOJ3534重建
分析:首先,很显然我们要求的是:∑e∈TPe∗∑e′∉T(1−Pe′)\sum_{e\in T}P_e*\sum_{e&#x27;\notin T}(1-P_{e&#x27;})e∈T∑Pe∗e′∈/T∑(1−Pe′)前者可以用矩阵树定理算出来,问题就是转化后半部分。∑e′∉T(1−Pe′)=∑e(1−Pe)∑e∈T(1−Pe)\sum_{e&#x27;\...原创 2019-03-01 21:58:18 · 162 阅读 · 0 评论 -
【线段树】【DFN】2019雅礼集训 two
题意:分析:翻译一下题意:给出两个N个点的树,首先选择A树中的一条边删除,然后将所有包含此边的路径u-&amp;gt;v(要求u,v在B树中是相邻的),对应的B树中的边(u,v)删除。由于扯到了子树,显然可以考虑DFN的方法。很明显,路径包含关系在DFN中表示为:对于一条边(u,v),假设深度deepu=deepv+1deep_u=deep_v+1deepu=deepv+1那么所有包含此...原创 2019-01-09 08:36:52 · 313 阅读 · 0 评论 -
【DP】【强联通分量】【组合数学】CodeForces804F Fake bullions
分析:首先,观察i%su=i%svi\%s_u=i\%s_vi%su=i%sv这两个条件,无非就是说,对于u组中,某个拥有金块的人x,则所有v组中,满足x≡y(mod (su,sv))x\equiv y(mod\ (s_u,s_v))x≡y(mod (su,sv)) 的所有y都可以得到一个假的金块。由于这个贡献是可以传递的,那么在一个强联通分量中,由于其能到达任意一...原创 2018-12-25 09:37:24 · 250 阅读 · 0 评论 -
【欧拉回路】四校联考1024T1
题意:分析非常简单的欧拉路板题#include&lt;cstdio&gt;#include&lt;cstring&gt;#include&lt;algorithm&gt;#include&lt;cmath&gt;#include&lt;vector&gt;#include&lt;stack&gt;原创 2018-10-24 19:23:02 · 192 阅读 · 0 评论 -
【点分治】【点分治序】BZOJ3784 树上的路径
分析:首先,定义点分治序为:每次找到重心后,以重心为根,当前子树的DFS序。每一个重心的DFN序次连接,就组成了点分治序。显然,点分治序的长度是NlogNNlog NNlogN级的。现在,根据一般点分治的方式,在以X为重心时,我们要找到所有子树中的点,与X的距离。对某个点u而言,如果考虑u->x->v的一条路径,则v不能在与u相同的子树中。且这个v在点分治序上的位置是相邻的。...原创 2018-10-29 19:13:45 · 326 阅读 · 0 评论 -
【图论】【DFS】三校联考10.20T2
题意寻找有多少条边满足:图中所有奇环都包含这条边,且这条边不属于任何偶环分析:最后一个性质好坑。。。一直在想那个性质结果T3都没来得及做…直接建一个DFS树。因为是无向图,所以只存在树边和返祖边。然后很显然只有一条返祖边与树边形成的环是有效的。并且!返祖边有贡献当且仅当全图只有一个奇环!!!。。。。#include<cstdio>#include<cstring&...原创 2018-10-20 16:41:08 · 188 阅读 · 0 评论 -
【图论】【DFS】AGC013 B Hamiltonish Path
分析:很简单的DFS水题。很容易发现,这个起点和终点的条件是很容易构造的,我们只需要随便从一个点出发,向其中某个方向一直dfs下去,直到走不动了,那个点设为起点。再从另一个方向一直dfs下去,直到走不动了,设为终点。找起点用栈就可以了。#include&lt;cstdio&gt;#include&lt;cstring&gt;#include&lt;algorithm&gt;#incl...原创 2018-09-28 20:44:49 · 180 阅读 · 0 评论 -
【图论】2018国庆三校联考D5T2
分析:题意非常丑陋。。。简化出来就一句话:每个点有选中、未选中两种状态,现在给出一些矛盾关系,要求加入尽可能少的矛盾关系,使得没有合法方案。如此2sat的模型,显然需要2sat的连边方式。。。然后直接枚举每个位置选、不选是否合法即可。若不选合法,则考虑其练的边是否有一个选择的点,如果有则可以用1的代价使得这个点不选非法。具体的情况见代码:#include<cstdio>#in...原创 2018-10-07 19:52:17 · 189 阅读 · 0 评论 -
【图论】【最短路】2018国庆三校联考D1T2
题意:给出一个无向图,求其中包含点1的最小环。分析:这题方法非常的多,(因为结论非常的多)。比较常见的结论是:最小环一定是最短路树中,不在同一个子树(即从根出发第一个点不同)的两个点之间的边+两点到1的最短距离。最小环一定是到达某个点的最短+次短路(最短和次短也要求第一个点不同)。最慢的反而是标算给的方法:对与根相邻的点二进制分组,每次求从一组出发,到达另一组的最短路。#inclu...原创 2018-10-07 16:56:53 · 148 阅读 · 0 评论 -
【图论】【思维】AGC011C Squared Graph
分析:比较简单的思维题首先,由于在新图中,每个点是原图的一个点对,观察这个新图中,两点间存在边的条件:发现可以这么表示:在原图中又两个点(i,j)(i,j)(i,j),分别向与其相邻的点走一步,到达(u,v)(u,v)(u,v),那么(i,j)(i,j)(i,j)与(u,v)(u,v)(u,v)之间就有边相连。这样表示在之后的推导中有重要意义。假设我们考虑一个单一的联通块内部的情况:首...原创 2018-09-27 07:35:29 · 200 阅读 · 0 评论 -
【图论】【LCA】NOIP2015运输计划
分析:mmp出题人太垃圾了 尼玛树链剖分O(Nlog2N)O(Nlog2N)O(Nlog^2N)的算法跑得飞快,用LCA严格O(NlogN)O(NlogN)O(NlogN)的最后一个点却被卡了。就因为出题人也写的树链剖分!所以他造的大数据就按着他不会T为标准。所以搞出来的数据用树链剖分或类似的方法都跑得飞快。但我还是写一下只用LCALCALCA的算法吧。。。 首先,如果加速的边有贡...原创 2018-09-11 16:31:24 · 133 阅读 · 0 评论 -
【数论】【图论】【Exgcd】【LCA】Codeforces500G
题意:给出一棵树,有m组询问,每组询问包含2对点(u,v)和(x,y)。现在一个人从u出发,在u和v之间的路径上来回移动,一个人从x出发,在x和y上的路径来回移动,求什么时候两人能刚好出现在一个点上。如果不能输出-1分析非常棒的一道题啊。。。首先,要把这个在图上的问题转化成数论问题:对于每次询问,我们找到以下信息: 两条路径各自的长度,相交部分的长度,相交部分的两个端...原创 2018-09-07 20:29:07 · 244 阅读 · 0 评论 -
【2-sat】和平委员会
分析本题有两种解法,其中解法1比较常规,可以很好的理解,复杂度也是很不错的O(n)" role="presentation" style="position: relative;">O(n)O(n)O(n) 解法2在思想上更加简洁,粗略估计时间复杂度O(n2)" role="presentation" style="position: relative;">O(n2)O(n2)O(n^2)但原创 2017-09-11 22:14:59 · 437 阅读 · 0 评论 -
【图论】点分治总结&POJ2114Boatherds题解
点分治适用问题:统计一棵树上的路径的问题,因为树上的路径需要一个起点和终点来确定,所以朴素算法的复杂度常常为O(n2)O(n^2),然而,点分治可以将复杂度降为O(nlogn)O(n log n)。大体思路:首先我们引入一个“树的重心”的概念 定义一个点的权值为它的最大子树的大小 权值最小的一个点(或许有多个,但在点分治中并不在意这些)。有一个很显然的性质:以重心为根,最大子树的大小,必然不原创 2017-12-04 18:22:37 · 291 阅读 · 0 评论 -
【数据结构&图论】SPOJ Free tour II
题目大意:给出一颗树,有些点被染色过,每条边有一个权值,求这棵树上不经过k个染色点的最长路径(起点终点可以相同)分析:非常裸的点分治,套一个树状数组存储经过k个染色点的最短路径,为了避免卡常,我用了一个更新标记数组,不难实现。#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>原创 2017-12-11 13:41:52 · 182 阅读 · 0 评论 -
【数据结构&图论】BZOJ1095Hide 捉迷藏
题目大意给出一颗树,每个点都是黑/白色,初始状态每个点都是白色的, 有两种操作: 1,翻转某个点的颜色 2,询问整个图中最远的两个白色点的距离(若没有白色点输出-1,只有一个输出0)分析本题有 动态点分治/线段树储存括号序列 两种做法。 这里只介绍动态点分治的方法。 这个思路其实非常的淳朴,我们考虑对于单次询问,我们需要的操作: 按重心拆分树,对于每个重心,找到能经过该点的最大路径,最后原创 2017-12-09 08:47:10 · 1404 阅读 · 2 评论 -
【最短路】BZOJ1001狼抓兔子
题目描述:(略)分析: 平面图中的最小割=其对偶图的最短路#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#define SF scanf#define PF printfusing namespace std;void Read(int &x){ char原创 2017-09-20 13:57:47 · 214 阅读 · 0 评论 -
【最小生成树&LCT】Codeforces603E-Pastoral Oddities
题目大意:给出一个图,求使得这个图中每个点的度数都为奇数。 求出用前i条边,使图满足条件的情况下,最大边权的最小值。分析:SolutionA LCT维护最小生成树很容易发现一些性质: 如果要使得图中每个点度数为奇数,那么每个联通块中点的个数一定为偶数: 根据题目,为了使最大边权最小,我们可以把每个联通块看成它的最小生成树,那么这棵树一定满足:每个非根节点的儿子结点个数必须为偶数,根节点儿子结原创 2017-09-28 10:06:56 · 467 阅读 · 0 评论 -
【Matrix-Tree定理】初探矩阵树小结
目前我也只做过一些矩阵树的模板题,对于这个神奇的算法了解并不深入,再加上这个算法的证明需要一定的线性代数的基础,所以这篇博客目前只能说是我对于这个定理自己的理解,重点并不在于证明。问题描述矩阵树问题直观地说,就是给出一个图,求在这个图中生成树的方案数问题解法首先将这个图转换成一个矩阵,这个矩阵每一个点(i,j)(i,j) 用-1表示是否有一条边从i到ji到j相连, 如果i=ji=j,这个位置就表原创 2017-09-19 22:03:03 · 2070 阅读 · 0 评论 -
欧拉回路/路径【总结】
作为广大OIer的朋(gong)友(di)的欧拉,在图论中也贡(zuo)献(e)良(duo)多(duan),尤其是萌新经常会遇到以下两个恶心玩意。 欧拉路径:在一个图中,由i点出发,将每个边遍历一次最终到达j点的一条路径。 欧拉回路:i=j时的欧拉路径。 于是,如何确定一个图是否存在欧拉路径/回路,并找到这条路经,成为了出题人虐待萌新的法宝。无向图首先,在无向图中,要确定是否存在欧拉回路很容易原创 2017-09-01 22:16:01 · 13411 阅读 · 10 评论 -
【强连通分量】CEOI2012network
题目描述:给出一个有向图。 对图中某两个点p,q定义p到达q是指:从p出发,不经过相同的点,到达q有且仅有一条路径。 现在保证有一个点R,可以到达所有点。(输入数据保证合法) 第一问:求出每个点能到达的点的个数(包括自身) 第二问:求至少添加多少条边,可以使图中任何一个点都能到达所有点。 (这里的到达,同样满足上面的描述) 并且输出这些边(special judge)分析首先,很容易想到原创 2017-09-10 22:03:28 · 454 阅读 · 0 评论 -
【强连通分量】POJ1236Network of Schools
题目描述:分析第一问很显然,把强连通分量缩成一个点之后,图中剩下多少个入度为0的点,就需要发放多少次软件(这些点没有其他点给他分享),对于入度不为0的点,就一定会从到达它的点向它分享软件。 第二问其实问的就是把一个图,通过连边的方式,缩成一个强连通分量,至少需要多少条边。那么有一个很直观的思路:对于每一个入度为0的点,必须向它连一条边,同样的,对于每一个出度为0的点,必须从它...原创 2017-09-10 21:25:24 · 243 阅读 · 0 评论 -
【2-SAT】2sat问题小结
其实2sat问题比较简单(至少我目前还没做过很难的2sat), 而且也是很好写的一个算法,我估计即使没学过的选手(dalao)考场上遇到了自己手推都能推出来…问题描述2sat问题是一种逻辑判定问题 给出一个形如(a0∨b0)∧(a1xorb1)∧(a2∧bn)...(a_0∨b_0)∧(a_1 xor b_1)∧(a_2 ∧ b_n)...的逻辑表达式,它的特点是,由与符号连接每个部分,每个部分原创 2017-09-18 16:45:36 · 819 阅读 · 0 评论 -
【总结】二分图最大匹配
一些概念:二分图:设G=(V, E)是一个无向图。如果顶点集V可分割为两个互不相交的子集X和Y,并且图中每条边连接的两个顶点一个在X中,另一个在Y中,则称图G为二分图(如下图)。 二分图的性质:定理:当且仅当无向图G的每一个回路的次数均是偶数时,G才是一个二分图。如果无回路,相当于任一回路的次数为0,故也视为二分图。二分图的匹配:在一个二分图中,我们选出一些边...原创 2018-02-23 09:50:56 · 245 阅读 · 0 评论 -
【总结】一般图最大匹配
二分图最大匹配:首先我们回顾一下二分图最大匹配的算法:匈牙利算法 我们的方法是不停地寻找一条增广路,以增加我们的答案。其实带花树也是一样的思路,我们同样是寻找增广路。如果将匈牙利算法照搬到一般图上,我们会发现,算法是无法进行的。而问题出在奇环上。匈牙利算法,是基于反转操作的,每次找到一条增广路径,就将路径上所有的选择情况反转,以得到一个更大的匹配。但如果在一般图中,在增广路径走到奇环时,就会...原创 2018-02-23 11:38:44 · 5245 阅读 · 1 评论 -
【图论】Codeforces 1019C Sergey's problem
题意:给出一个有向图,在这个图中选择一些点,这些点不能有边直接相连,并且每个点都能从某个选中的点不超过两步到达。求任意一个方案。分析:也是非常简单的一道题。任意找一个没被删除的点,删去它及它连向的点,对剩下的图继续做,直到删空为止。然后按照删的反向顺序依次考虑:若所有连向它的点都没被选中,则选中这个点不会造成矛盾,直接选。否则就不选。这两种情况中,都能保证该点以及它...原创 2018-08-12 12:00:45 · 316 阅读 · 0 评论 -
【仙人掌?】【并查集】HDU6350 Always Online
分析:考场上看都没看的题。。。但实现起来居然异常简单(相对于隔壁D题动态点分治而言)。。。。这题除了利用了仙人掌图的定义。。其它都和仙人掌没关系。。。先考虑一个相对简单的问题: 如果给的是棵树,怎么求答案?树的性质无非就是两点间路径唯一,也就是说,这里的“最大流”可以看作两点间路径上的边权最小值。从大到小加入边。每次加入时,因为两端点所在的联通块中,这条边边权一定是最...原创 2018-08-07 12:10:02 · 397 阅读 · 0 评论 -
【图论】 【树状数组】Traffic Network in Numazu
分析:用LCT水过去当然也是可以的啦。。。。 不过这里讲一下不用LCT的方法。。(当然也不是树链剖分)这个图肯定是一颗基环外向树,先忽略环,剩下的一定是一个森林。对于每个森林,其实可以用dfn+树状数组维护没两点之间的距离: 按照dfn,在每个位置存储它到达当前根节点的距离,然后询问在同一颗树中的点时,可以用lca求出两点最近公共祖先,两点距离就是dist(u)+dist(v)−2...原创 2018-08-14 10:47:19 · 182 阅读 · 0 评论