![](https://img-blog.csdnimg.cn/0e02075e422d4b17b19a789ad6280de9.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
图论
一些简单图论题
lamentropetion
---
展开
-
2023年浙大城市学院新生程序设计竞赛(同步赛)G
不难想象其实就是操作结点的子树和该点连通的黑色连通块的所有结点,对这些结点会有影响。首先想法非常单一,一定是去枚举操作点,然后看它染白和不染的价值差值。黑色连通块容易用树形dp求,然后就是操作点到最近白色祖先距离怎么求。那么差值其实就是黑色连通块大小 * 操作点到最近的白色祖先的距离。也就是说,把一个黑色结点染白之后,对哪些结点的价值会影响。dfs即可,记录上次的白色结点是什么即可。原创 2023-12-23 23:45:17 · 934 阅读 · 1 评论 -
【01分数规划】ABC324F
首先看到这个形式很容易想到 01 分数规划,即去二分答案,然后就是转化成 是否存在一个路径使得 sigma b - mid * sigma c >= 0。显然只需要改变一下边权,跑一遍最长路即可。原创 2023-12-14 01:30:10 · 580 阅读 · 0 评论 -
【强连通+背包】CF1763E
那么用哪些多大的强连通连接在一起就用背包处理一下就好了,因为要让节点数尽可能少,代价就是节点数,价值就是每个团的点对数,即x * (x - 1) / 2。然后,因为在这个前提上,要让单向节点数尽可能多,那就考虑将这些强连通分量用有向边连接。首先,先考虑第一个条件,要保证是p个节点互相到达且节点数最少,一定是个强连通,把背包的方案求出来之后直接计算贡献即可,具体看代码。然后背包完之后考虑第二问,求单向点数。原创 2023-10-24 22:41:38 · 221 阅读 · 0 评论 -
【离线/并查集】CF1213 G
心血来潮写一下这个*1800的题解,思路一下就出了,但是一开始多了个log被卡了,提醒一下自己。问题是点对的贡献怎么算,很显然可以拆,对于一个连通块,贡献为sz * (sz - 1)这样子 T7了,但是枚举权值就没问题,不知道为什么这样会快,可能是STL的问题....离线的写法还是有讲究的,最好是把答案全部求出来再去O(1)查询,不然容易被卡。排序之后枚举边的权值,就是把边一条条加上去,相当于Kruskal的过程了。之前是 x * (x - 1) / 2,y * (y - 1) / 2。原创 2023-10-20 00:23:29 · 271 阅读 · 0 评论 -
【MST】 CF1108 F
对于这些边,如果加了该边和现在的边集产生环,那么这边一定不能加,改边不影响MST的唯一性,因此这种边不需要操作。设想样例中和5结点再连一条权值为3的边,那么该边一定要加上MST,否则就不连通了。归根到底,我们要操作的是和Kruskal最后一条边权值相同的边,且可加可不加的边。这启示我们,我们要操作的是和Kruskal的最后一条边权值相同的边。那么,对于加了该边之后和现有的边集不产生环的边,都要操作吗,也不是。权值为3的两条边,选其中一条即可,但是不能两条都选,这样会形成环。原创 2023-10-15 01:42:59 · 367 阅读 · 0 评论 -
【二分图染色】ARC 165 C
首先考虑一条链的情况,注意到如果两条相邻的边加起来 < x,一定不行。不合法的情况是相邻的点相同颜色但是边权 < x。同时注意到 x 具有单调性,考虑对 x 二分。在check时进行二分图染色。这个结论推广到图也是一样的。原创 2023-09-26 01:40:00 · 346 阅读 · 0 评论 -
【简单图论】CF898 div4 H
实现就很简单,先去树上找环,然后找出这个根,分别给a 和 b BFS一遍,得出两个dis数组,比较一下即可。v 离它所在的树枝的根的距离 < m 离这个根的距离时是 YES。对于只有的环情况 和 m = v 的情况需要特判。原创 2023-09-25 21:03:10 · 921 阅读 · 0 评论 -
【边双】CF Edu10 E
注意到在同一个边双连通分量中,如果存在一条边的边权是1,那么这个边双连通分量中所有点对的路径中都存在一条边的边权是1,因此我们考虑缩点,缩完点之后是一棵树,这样路径就唯一了。只需要看 st的分量 到 ed的分量 的路径中是否存在边权是1的边即可。st 到 ed存在多条路径。原创 2023-08-31 18:59:08 · 176 阅读 · 0 评论 -
【最小环】CF1205 B
【代码】【最小环】CF1205 B。原创 2023-08-18 00:05:36 · 125 阅读 · 0 评论 -
【枚举边+MST+组合计数】CF1857G
可以发现对于每一对点,贡献是 s - 这对点对应的环的最大边 + 1。然后,根据惯用套路,枚举树上的点对问题可以转化为枚举边,按边去算贡献。在Kruskal的过程中,一条边是作为最大边出现的,贡献是。那么这样就有了 n^2 的做法。原创 2023-08-15 15:25:09 · 219 阅读 · 1 评论 -
【构造】CF1761 E
【代码】【构造】CF1761 E。原创 2023-08-14 19:39:01 · 174 阅读 · 0 评论 -
【枚举边+树的直径】CF14D
两条链不相交,说明是在不同连通分量中,我们可以枚举边来把树分为两个连通分量,然后分别计算直径即可。原创 2023-08-02 14:24:49 · 210 阅读 · 0 评论 -
【组合计数】CF1151E
对于每条边,它包含在区间的条件是ai和ai-1都在[l,r]范围内,贡献为min(a[i],a[i-1])*(N-max(a[i],a[i-1])+1)对于每个点,它包含在区间的条件是ai在[l,r]范围内,因此贡献为ai*(N-ai+1)一个是枚举右端点r,然后计算左端点l的贡献。我们要统计区间数量,有两个思考方向。对于点和边我们去单独计算贡献。还有一个就是,更换枚举对象。连通块数量=点数-边数。因为答案是连通块数量。原创 2023-08-02 10:53:33 · 206 阅读 · 0 评论 -
【树链剖分+MST】CF609E
先把全局的MST求出来,然后对于一条边,如果它本来就在MST中,说明代价就是MST的权值和,否则它加入MST中,此时MST形成了环,我们把环中最大的那条边删掉,就相当于用这条边换掉了环中最大边,这样就是最小权值和。那么怎么求环中最大边,直接树剖即可。原创 2023-07-30 00:20:24 · 195 阅读 · 0 评论 -
【MST+离线】CF1851 G
【代码】【MST+离线】CF1851 G。原创 2023-07-26 23:33:17 · 133 阅读 · 0 评论 -
【*1900 图论+枚举思想】CF1328 E
先考虑一条链,那么直接就选最深那个点作为端点即可。为什么,因为我们需要遍历所有点的父亲。推广到树,也是要遍历所有点的父亲。原创 2023-07-26 20:41:43 · 1713 阅读 · 0 评论 -
【*1800树上贪心】CF1401 D
按照CF惯用套路,这样的n^2贡献肯定是更换枚举对象,我们去枚举边,按边算贡献。首先,1尽可能少,那就是让pi尽可能不合并地摊到所有边上,然后计算贡献。对于一条边的贡献应该为sz[u]*(N-sz[u])*p[i]然后就是贪心了,大的边权摊到经过次数多的边,小边权到次数小的边。同时需要分类讨论这些给定的质因子个数和边数的大小关系。原创 2023-07-26 19:44:22 · 110 阅读 · 0 评论 -
【简单图论】CF1833 E
显然,最大值就是什么边都不连的连通块个数,最小值就是能连的都连上。那就是,如果一个连通块存在度为1的点,就把它当作接口连接。原创 2023-07-24 01:19:39 · 635 阅读 · 0 评论 -
【树链+EXGCD】杭电多校第一场 A
给定一棵树和两条路径,每条路径都有起点和终点,起始时起点有人,每隔一秒都会往终点走一步,会从起点走向终点再会起点这样不断地周期性地走,让你求一点,使得两个人能在这点相遇且花的时间最少。首先答案一定是两条路径相交的点中的一个,因此可以把一条路径标记一下,然后对于另一条路径去check是否重合。比赛的时候只是分成四种情况讨论,并没有解方程,赛后调了很久也没有全对,但是只是几个数据没过,也根本调不出来。对于树链的操作,只需要求出LCA,分成两部分,暴力跳即可。那就这样吧,反正大部分都对了 (原创 2023-07-18 22:13:49 · 1135 阅读 · 0 评论 -
【BFS树】“范式杯”2023牛客暑期多校训练营1 K
对于第一部分,对于一个结点和该结点相邻的非树边上产生的有效结点数最多为 K-dis[u]只不过对于叶子结点,有贡献的边至少为1,因此需要cnt=max(cnt,1)对于这个结点产生的所有非树边,产生的贡献为(K-dis[u])*cnt+1。该结点可能会有很多条非树边,因此要先统计该结点非树边的个数cnt。对于第二部分,有一个结论就是,把结点加在叶子结点对应的边上最优。对于一个叶子结点,贡献也为(K-dis[u])*cnt+1。首先对1结点进行BFS,形成一棵BFS树。第一部分由BFS树的非树边组成。原创 2023-07-18 10:26:49 · 274 阅读 · 1 评论 -
【树链】CF1702 G
还有一种情况是:G可能分裂成多条链,即V2[i]中的点可能和ed的lca不为V2[i],去除这种情况即可。我们可以把所有可能是链上的点排序,把深度最大的点默认成起点st,接下来去找终点ed。如果点在链上,那么lca(V[i],st])=G||lca(V[i],ed)=G。那么可以把除了这条链的点排序,取深度最大的点作为ed即可。首先,一条树链可以被分为两部分:左半部分和右半部分。即lca(V[i],ed)!=V[i]且深度最大。如果两个都不满足,那么该点一定不是链上的点。记G=lca(st,ed)原创 2023-07-17 20:11:29 · 233 阅读 · 0 评论 -
【图游走+二分图】牛客小白月赛 43 F
这个结论可以想象特殊情况,把图看成一条链,多模拟几个例子就行了。图上两个点之间距离的奇偶性和奇环有关。做法二和分层图是一个道理。首先是经典的猜结论环节。原创 2023-07-16 19:40:34 · 139 阅读 · 0 评论 -
【GCD+MST】ABC210 E
初看一定是没思路的,但是模拟一下小数据,思路很快就出来了。原创 2023-07-13 00:36:53 · 121 阅读 · 0 评论 -
Robocom2021 初赛
收录一下Robocom初赛的屌题,调了我一个多小时,是我菜了。原创 2023-07-12 23:07:25 · 257 阅读 · 0 评论 -
【并查集+组合计数】ABC226 E
如果没有直接看出结论,可以画几个链和树等特殊的图,可以发现,树是不满足条件的,环是满足条件的,因此可以初步猜想,由环和DAG组成的图是满足条件的,即把环缩点之后是个DAG,这样的图是满足条件的。先去判断是否满足条件,如果一个连通分量里面点数!=边数,那么就是不满足条件的。然后手摸样例可知,一个图可能会有很多连通分量,每个连通分量应当满足以上条件。每个连通分量都有一个环,因此每个连通分量都有2种方案。首先有个条件:每个点只有一个出边。原创 2023-07-12 20:19:18 · 242 阅读 · 0 评论 -
【dij变形】牛客练习赛93 C
重要的是在松弛的时候要满足什么条件才开始松弛。这里是用两个点来松弛一个点。原创 2023-07-12 10:45:06 · 427 阅读 · 0 评论 -
【*2000 暴力树形DP】CF1230 E
【代码】【*2000 暴力树形DP】CF1230 E。原创 2023-07-11 22:23:04 · 137 阅读 · 0 评论 -
【最短路+状压】CF1846 G
【代码】【最短路+状压】CF1846 G。原创 2023-07-11 16:14:25 · 228 阅读 · 0 评论 -
【二分图+数据范围】牛客练习赛 E 奇环
【代码】【二分图+数据范围】牛客练习赛 E 奇环。原创 2023-07-11 14:19:20 · 204 阅读 · 0 评论 -
【分层图最短路】JLOI2011 飞行路线
因为多了一维约束,因此可以在dij的基础上多一维cnt表示已经免费了多少次,然后跑最短路即可。原创 2023-07-10 14:36:34 · 301 阅读 · 0 评论 -
【dfs序+树上差分】ABC309 E
不同的是是对一部分子树操作,因此对于离子树根结点d+1距离的在子树内的结点进行减操作。至于如何判断一个点是否在子树内,只需求出dfs序即可。这里lca判断会多个log,会超时。对子树进行操作,就可以树上差分。然后做一次前缀和就行。原创 2023-07-10 13:59:43 · 287 阅读 · 0 评论 -
同余最短路
那么答案就是枚举同余类,对于每个同余类,能到达的楼层数的贡献就是(H-dis[i])/X+1。设dis[i]为在模X意义下,+Y和+Z之后%X余数为i的能凑出来的最小数。前者是从这个最小数开始+X,能到达的楼层数,+1是因为要算它本身。对于每个整数,都是由1经过*10和+1这两种操作转移过来的。最后的数位和就是+1操作的次数,*10对数位和没有贡献。设dis[i]为在模N意义下达到%N余数为i的最小代价。起点是1,因为一开始是在第一层,%X=1。因此同余类之间建两条边:*10和+1。原创 2023-07-09 16:26:53 · 607 阅读 · 0 评论 -
【抽象拓扑排序】ABC216 D
有2*n个球,每个球涂n种颜色,每种颜色恰好涂两个球,把这些球放进m个栈里,每次操作可以弹出两个相同颜色的球,问是否存在方案使得将所有栈清空。对于这道题,上下两层建一条有向边,然后做一遍拓扑排序即可,如果不存在环,那么就说明有解,否则就是无解。注意到,对于上下两层的球是有有向约束关系的,即上面那个球弹出之后下面那个球才能弹出。原创 2023-07-06 15:08:33 · 186 阅读 · 0 评论 -
【分层图BFS】AB路线
走到当前格子是第几步和格子的字符种类影响了能不能走该格子,因此需要多加一维k,表示走到当前字符种类的第k步。然后就可以去BFS了,但是每个状态可能会重复遍历,我们要求的是最少步数,怎么办。可以用一个类似与最短路的办法,记录一个DP数组,然后松弛。最后在统计答案的时候记得枚举一下这是以第几步到达的终点。首先看是什么影响了决策,即能不能走这个格子。原创 2023-07-05 16:54:05 · 323 阅读 · 0 评论 -
【反图+拓扑排序】ABC245 F
这道题中,我们需要找出所有能够到达环的结点,因此我们先建立反图,然后做一遍拓扑排序,剩下的点就是原来的图中所有能够到达环的结点(感性理解即可)原创 2023-07-04 13:36:41 · 142 阅读 · 0 评论 -
【多维BFS】ABC308 D
决策是走到字符和预期相等的格子,因此预期字符会影响决策,因此需要把预期格子加入到状态中。至于预期状态怎么表示,因为是周期性的,可以模仿上次的,d=(d+1)%5即可。首先,我们发现到达一个格子之后,下一个格子的字符是确定的。原创 2023-07-02 17:40:25 · 172 阅读 · 0 评论 -
【多维Dij+DP】牛客小白月赛75 D
然后注意到边的权值,如果你取反了边权就变成了2,即边权不是2就是1,因此可以01BFS,复杂度为O(N),也可以Dij,O(NlogN),这里用Dij写。在这道题中,如果把某一个位置取反,那么就有可能有些本来不能走的路可以走了,因此对决策有影响,所以要加上一维:当前的0/1值。注意写法,多维Dij可以设结构体也可以设Tuple(但这里会超时),结构体内部需要排序。原创 2023-07-02 01:00:59 · 332 阅读 · 0 评论 -
【最短路dij】牛客练习赛112D qsgg and Subway
【代码】【最短路dij】牛客练习赛112D qsgg and Subway。原创 2023-06-24 00:03:25 · 388 阅读 · 0 评论 -
【按位贪心 代码源每日一题div1】Minimum Or Spanning Tree
怎么check呢,check函数里,问题就转化为:选一些边,使得不成环且或起来这位是0。对于这类按位贪心问题,一般考虑从高位往低位贪,然后check这位能不能是0/1。对于这道题,因为是最小,所以优先考虑这位能不能贪成0,然后去check。求最小的生成树,考虑按位贪心,即从高位往低位贪心。原创 2023-06-11 11:42:55 · 102 阅读 · 0 评论 -
【猜结论+Tree】ICPC 昆明 F Find the Maximum
考虑一条长度>=4的路径,将其对半分,因为长度/2,权值和有一段<原来的1/2,有一段>原来的1/2,因此>原来的1/2的那段的均值就乘了个大于等于1的值,一定不差于原来一整段,那么就可以一直分下去,直到分到长度为2或者3的链。给定一棵树,问你对于所有的简单路径,下面这个式子最大值是多少。那么我们可以枚举所有长度为2或者3的链,然后统计最大值即可。原创 2023-05-28 20:38:17 · 56 阅读 · 0 评论