图论题目合集
菜肴制作
要求把
每个条件会给出两个数
解:
看起来很像拓扑排序。于是我们对于每个条件
但是我们发现,如果我们这么做,无法保证编号小的更靠前:因为如果同一时刻有多个入度为 0 的点,我们并不知道选哪一个可以让编号小的更靠前。
因此转变思路,在反图上面作拓扑排序,每次如果有多个入度 0 的点,一定选其中编号最大的。
这样得出来的序列,就是所求序列的翻转。
P1129 矩阵游戏题解
校园网
第一问:强连通分量缩点后,入度为
第二问:缩点后,
抢掠计划
强连通分量缩点后,剩下一个 DAG。之后就很普通了。
魔法树
树剖
水管
最大流
CF877E
dfn 序转换到线段树上。
求和
见
挖井
挖井可以看作和
推箱子
一种搜索的想法是一个状态里包含四个数:
但这个状态是
我们发现只关心箱子的步数,那能不能只存箱子的位置呢?这显然不行,因为我们要知道人往哪边推。
于是两种方案折中一下:当人推箱子的时候,人一定在箱子相邻的四个位置之一。而且我们不关心人走到另一边花多少步。
新的状态:
每次转移状态,枚举箱子下一次移动是朝哪边,同时再用一次 BFS 看一下现在人的位置能不能移动到枚举到的推箱子的位置,注意这个过程中不能经过箱子的位置。
时间复杂度是
考虑时间复杂度的瓶颈其实在于每次看人能不能移动到另一个位置,这也需要
我们把每一个格子抽象为一个结点,相邻的合法格子之间连边。问题就变成了
可以通过分类讨论
冗余路径
题意:给图增加一些边,使得图内没有割边。
答案:割边个数
证明:对图进行边双连通分量缩点,得到一颗树。设这棵树有
而发现如果把这些度为
Edges in MST
Kruskal 分阶段进行,如果一条边想加入的时候,发现比他小的边构成的连通块,已经使他的两端连通了,说明这条边一定不选。
把剩下可能选的边构成一张图,这张图里面的割边就是必选的边。
Fairy
删掉一条边,让原图变成二分图,求方案数。
先把图里面所有连通分量找出来,如果这些连通分量中有至少两个不是二分图,方案数为
如果全部都是二分图,方案数为
剩下的情况我们就在那个不是二分图的连通分量里删边了。
考虑二分图的判定条件,一般就两种:可以二染色,没有奇环。
但是如果想判定二染色,需要 DFS 一遍,看起来不太行。考虑判断删掉一条边之后,要破坏所有奇环。
用一个图论经常使用的 trick:取 DFS 树。
因为是无向图,所以非树边只会是回边。
如果删一条回边使得奇环没了,显然必须要求图中只有一个奇环。剩下讨论删一条树边的情况。
下面定义:一条回边加若干树边形成的奇环称为错环,一条回边加若干树边形成的偶环称为对环。
因为要破坏所有错环,所以有一个 simple 的想法:取所有错环的树边的交集。这个交集的大小就是答案。
但是这个想法是错的。比如: 1-2-3-4
且 1-3, 1-4
。上面的方法会输出 2
。
观察这个算法为什么会错误:如果一个错环 + 一个对环,就会诞生一个奇环。
猜结论:如果一条树边不在任何一个对环,且在所有错环里,就可以。
(注意:我们这里不直接说奇环,而是分成对错环的原因是,对错环一定只有一条回边,但是奇环可能横跨多条回边。)
证明:这个命题其实有两个方向。
先证明:如果一条树边在所有错环,且在至少一个对环里,删了这条边不能让图变成二分图。
考虑一个错环
记这个异或为
而考虑两个环的异或,发现这个异或一定可以把所有边划分成若干个环。
所以一定有一个奇环,所以一定不能让图变成二分图。
再证明:如果一条树边在所有错环,且不在任何对环里,删了这条边就行。
把这个图二染色。不管是否二分图。
记这条树边是
我们把其中一个连通块所有颜色取反,就构造出一种二染色的方法。(取反的 trick 也经常用)
证毕。
有了这个结论,我们只需要判断一条边是否在所有错环且不在任何对环就行了。(时刻注意错环的奇环的定义差别)
可以对每一条非树边用树上差分。但是如果求 LCA 会带一个
于是我们就做完这题了。
整理一下思路:
-
读入。
-
对每一个连通块二染色。
-
枚举每一条边,看一下是否有
个连通块不是二分图。如果有,答案为 ;如果所有连通块都是二分图,删掉任意一条边都可以;否则选定这个不是二分图的连通块的根。 -
一次 DFS。对每条回边,判断一下是对边还是错边,在对应的差分数组上加减;对每条树边,记录一下到达这个儿子走的边的编号,同时在递归进入儿子之后,让当前结点的差分数组累加上儿子的。
注意这里直接累加儿子的差分数组是正确的,同时可以大幅简化代码。
注意为了保证每条边只会统计一次,在每条边上要记录一个
,在走过这条边的时候把这条边的反向的 改成 。(和求割边的 一个意思) -
枚举这个连通块内的每一条边,看一下它两端的差分数组是否满足在所有错环且不在任何对环内。把所有满足边的加入答案数组。
-
如果错边只有一条,把这条错边加入答案数组。
-
输出,注意输出的编号要从小到大排序。
物流运输
思路:
其中
数据范围很小,预处理随便跑。跑完预处理随便 DP 就行了。
难点是想到 DP。
Network Attack
删除两条边,使得图不连通,求方案数。
先把割边这种简单情况拎出来解决了。
① 选两条割边,有
② 选一条割边 + 一条非割边,有
③ 选两条非割边。下面解决这种情况。
因为现在已经和割边没有关系了,所以可以把每条割边连接的两个点合并成一个点。此时图里面就没有割边了。
经典 trick:DFS 树。
显然两条回边没办法不连通。
① 一条回边 + 一条树边。可以用一个
② 两条树边。我们发现,这两条树边一定有一条是另一条的祖先!如果它们是左右结构,因为没有割边,所以图依然会连通。
这时候我们的问题就变成:找两条有祖先关系的树边,使得图不连通。
记更浅的那条边为
进一步分析,我们发现:记跨越
也就是说,所有跨越
假设此时所有跨越
现在的问题又变成了对于一个固定的
这时我们只需要判断跨越
如果我们求出了这个
那怎么求
我们可以用并查集做。先把所有回边按照靠上的点的深度从深到浅排序。显然一条回边会把 这条回边两端路径上 所有还没被赋值的点的答案 赋值为 这条回边较靠上的点。
可以用并查集,类似 People are leaving,把所有相连的答案被赋值的点合并到一起。每次枚举回边路径上的点,可以利用并查集跳过连续的被赋值的点。
但是,如果用按秩合并好像会导致代表元素不是最浅的点?
没关系,可以用一个额外的数组记录每一个连通块内最浅的点是哪个。
Even and Odd(无题号)
给定一张连通无向图,两点之间的距离若为奇数,称为奇对;偶对类似定义。(距离:简单路径长度,若距离可奇可偶,啥也不算)
注:关于简单路径的问题,尝试先想没割点的,再想圆方树。
先考虑没有割点的情况(点-二连通)。
如果是二分图,很简单;而如果不是二分图,就说明有奇环,可以推出任意两个点之间的距离奇偶性都不确定。
如果有割点,考虑圆方树。(圆方树:把割点全部删除,剩下每一个连通块都是方点,每个割点都是圆点,每个圆点和对应的方点连边,得到一棵树)
观察到:如果一个方点内部不是点-二连通的,发现如果两个点在这个方点的两侧,这两个点的距离奇偶性也是不确定的。
所以每一个不是二连通的方点,会把圆方树切成若干个连通块。对这些连通块内部各自求答案累加即可。
平衡的技能树(无题号)
给定一张图,修改某些边权,使得最小生成树和最大生成树费用相同。(其实就是每颗生成树费用相等)
先考虑简单情况:一个圈。
这种情况等价于要求环上每条边的边权相等。所以最优解就是找出出现次数最多的边权保持不动,其余的边都改成这个边权。
进一步:点二连通分量。
还是要猜所有生成树费用相等的等价条件。
显然每条边费用相等是一个充分的条件。那这是不是必要的呢?感觉好像是,尝试证明!
先从图里面取出一个环,显然这个环上所有边边权应该相同。
再考虑一个“耳朵”:从这个环上面长出去的一条路径。
发现无论是连着耳朵上两个点的边,或者连着原本的环上一个点还有耳朵上一个点的边,都能找到一个环。所以所有边边权相等。
于是证明了点二连通的情况。下面考虑圆方树。
每个方点内部边权相等。而如果一条边有圆点(割点),这条边显然不管在任何生成树里面都会选。
所以只需要把每个方点内部的边权都改成这个方点内部边权的众数即可。
铁人两项
给定无向图,计数三元组
简单情况:点二连通。
任意三个都有解!(注意有顺序,是
证明的话,也是先从一个环说起,然后不停加耳朵,画画找路径。
进一步:圆方树。
分类讨论
Tourists
一个非常显然的事实就是:当你到达一个点双时,一定存在一条简单路径,从外部进入这个点双,然后经过点双里面的权值最小点,然后再走出这个点双。所以一个点双对答案的贡献必然是点双里面的最小权值
于是我们可以建立圆方树,方点的权值为点双中的最小圆点权值。然后原图就变成了一棵树,询问时就可以直接树剖套线段树求路径最小值了
但是修改操作似乎并不是非常方便。因为一个圆点的权值变动,可能会引发与之相连的方点权值变动(当这个圆点是点双中的的最小权值点时会发生这件事情)。那么我们可以对每个方点维护一个multiset,里面存所有与之相邻的圆点权值,然后权值就是multiset中的最小值,每次修改就删掉原来的权值,插入新的权值。然后我们每修改一个圆点的权值,我们就遍历与之相邻的所有方点并按上述方法修改multiset
但这样是会被菊花图卡成n方的。因为菊花图的根节点,有n-1个方点与之相邻,每次修改都遍历一遍的话,就GG了
于是一位巨佬告诉了我更加优秀的方法:对于一个方点,multiset里面存它所有子节点的权值。然后修改一个圆点时,就只需要动它父亲的multiset(它的父亲必然是一个方点)。询问时,仍然可以正常询问,只不过如果lca是一个方点,那还要额外计算fa[lca]的权值对答案的贡献
具体实现需要用Tarjan求一下点双,然后还要一棵维护区间最小值的线段树,以及STL的multiset
Messengers
无向图,有两个人初始都在一号节点,你可以给两人分别设定一条路径,他们就会按照这个路径走。
有一个结点(不是
求一种安排顺序,使得无论如何,每个结点都被访问过。(访问就是到达结点)
结论:如果 A 的路径是
证明:如果
那我们只需要满足,路径任意一个前缀都是点双连通的。
而这是一个等价条件:如果存在不是
所以我们判断无解,只需要判断是否存在不是
Museums Tour
看到周期,考虑拆点
把每一个博物馆
显然一个强连通分量里的都可以取到,我们强连通缩点,一个点的权值定为这个点内部可以到多少个不同的博物馆。
然后就可以 DAG 最长路了。
但是有个问题:会不会
不会,因为如果
这题卡 vector,要用前向星;还卡栈空间,加了个 inline 就过了。
Paths and Trees
题意:找到边权和最小的最短路树。
普通最短路树:用 Dijkstra,每次取出来一个点进行松弛的时候,如果点
边权最小最短路树:
-
成功松弛的情况有两种,一种是到达新的点的距离严格小于原本的,这种肯定必须更换
;另一种新距离相等,于是我们可以比较一下这一次的边权和原本的边权,保留更小的。 -
我们发现上面的比较边权其实没必要。因为最短路长度相等,
比 更先被拿出来松弛 ,肯定是因为 ,所以 。因此,如果最短距离相等,也可以直接替换。
毛毛虫
一张图被称为毛毛虫,当且仅当有一条路径,使得每个点到路径上的距离
先考虑环:显然要合并
然后考虑边双:也需要合并
于是边双缩点成树。显然找一条直径作为最终毛毛虫的路径。
圆桌骑士
求有多少个点不在任何一个奇环内。
关键结论:每个点双,要么全不在,要么全在。
卧底行动
有多少种方法把图分成一个独立集和一个团?(之间的边随意,不能全部是独立集或者全部是团)
一个点,要么属于独立集,要么属于团。于是考虑用 2-sat 求解。
用 2-sat 求出一组解之后,我们还要求出解的个数。我们发现,新的解要么是从原解的一边,拿出一个点放到另一边去;要么是从原解的两边交换一对点。
如果是拿出一个点放到另一边:
-
团放到独立集。我们要求出团里面有多少个与独立集的不连边,同时注意要保证团的点个数
。 -
独立集放到团。和上面同理。
如果是交换:
对于换到团的那个点:要么连接团里面所有点,要么只不连接和他交换的那个点。
对于换到独立集的那个点:要么不连接独立集里任何一个点,要么只连接和他交换的点。
枚举两个点判断即可。
排列最小割
(高五 Class 3)
题意:给定图,找出一个点的排列
首先求出最小割树。(Gusfield 等价流树)定义两点之间的距离为它们树上路径边权的最小值。我们就是要找一个排列,使得
取出树上最小的边
观察:存在一个最优解 OPT,只经过
于是可以递归的得出答案就是最小割树中所有边之和。
Qtree 6
对每个结点维护:
(只考虑黑变白,白变黑对称)
假设
然后我们让
怎么找最近的白点?可以线段树维护区间内第一个 0。
可以树剖维护,
寻宝游戏
小蓝书“异象石”。
建造军营
很显然能看出是个边双缩点 + 树形 DP。
先缩点,统计每个大点内部有
先考虑
所以
显然
若当前要增加子节点
-
的子树还没有: 子树内必须选, 。 -
的子树内选了:则 选不选都可以。 。
因此
注意是赋值运算,而且
Cheap Robot
有几个观察:
-
当机器人在
时,电量必须 到达最近充电桩的距离。 -
假设当前在
,从 走到最近的充电桩再走回来,点亮不会变差。
从每个充电桩跑最短路,设
因此我们只需要记录能到哪个点,只要能到,这个点的电量就可以变成
考虑从
转换一下,
若
因此我们就是要最大边权最小,可以对
切树
长链剖分原理。
以合并子节点影响的方式计算。当前在合并
-
不割
, . -
割
, .
注意转移之间会有影响,用临时数组记录。
暴力做是
变向
可以二分答案
对于边权大于
在 topo 判环的过程中,可以求出每个结点的 topo 序。对于边权
ABC277H
自己点进去看题意。
巧妙转化:因为
于是这题就可以转化为 2-sat 问题。(需要注意
(NOI2017)游戏
如果
我们其实只需要枚举 x
的位置为 a
或者 b
,就能覆盖所有情况了。所以是
Fair
题意:给定无权无向连通图,每个点有颜色。颜色种数
对每一种颜色建立一个超级源点。依次从
Is it Flowers ?
题意:判断一张无向图是否是 k-花。k-花:中间一个长度
满足以下条件的,就是 k-花:
-
有
个结点和 条边。 -
每个节点的度只能是
或 。 -
连通。
-
切断所有连接两个度为
的节点的边后,恰好剩下 个长度为 的环。
前三个很好判断,第四个条件只需要枚举所有边,暴力从 vector
里删除即可。
注:从 vector
里删除,可以先遍历所有元素,如果遇到要删除的,就交换到 back 上,然后 popback。
The Shortest Cycle
给定序列
发现连边的概率很大,根据抽屉原理,只要
采蘑菇
SCC 缩点 + DAG 最长路。
城市规划
给出
先按给出的关系构建有向图。分成不同连通块考虑。
-
当前连通块是 DAG,按照拓扑序形成一条链即可;
-
不是 DAG,排成一个环即可。
最大生成基环树
题目:求出一颗生成基环树,边权和最大。
可以在 Kruskal 过程中额外对每个连通块记录这个连通块是树还是基环树。
同样边权排序,但是这次边可以两头都连树,只是不能两头连基环树。
最小圈
01 分数规划。(其实不用理解得那么玄乎)
首先,越小越好,越大越可行,二分答案
接下来判断是否存在一个环的平均值
从分数规划角度理解:环就是有些边选了,有些边没选;有些点选了,有些点没选。
令每个点的权值
二分,
前k大边
根据原图
若答案路径的第
若
所以枚举
三点连边
一定是一条直径 + 离直径最远的点。
从直径上每个点依次出发 BFS 它不经过直径能到的点。
Graph Cutting
易知仅当
对一颗树:自底向上,每个结点把所有没配好对的儿子两两配。
如果没配对的儿子有奇数个,则 多余的儿子 - 自己 - 父结点 配成一条。
对于图:找 DFS tree,对于回边
Pairs of Pairs
找出 DFS tree,判断层数是否直接构成一条路径。
否则,深搜树每一层的结点两两配对,每层最多一个结点没用。
P4652 One-way street
边双缩点,显然一个边双内的边都不确定。
把要向上走视作 +1
,向下走视作 -1
。对于一个限制
差分完看看每条边的权值是正是负即可。
Xor Replace
数组最后加上一个数等于所有数的异或,每次操作就相当于交换一个数到最后一个位置。
判无解:如果有目标数初始没有,-1
;否则必有解。
对于每个
答案 = 边数 + 连通块数 - 1.
Company
一些点的 LCA = dfn 最大最小的结点的 LCA。
所以要改一定是删除 dfn 最值。
用一颗线段树维护。
炸弹
第一步:建图。
(用单调队列做)这样边数到了
第二步:求解
SCC 缩点。一个很直接的想法是:每个点引爆的个数,就是它所在 SCC 的后继个数。
但是这是不行的!如果直接找后继,
那怎么办?
简单的观察:每个炸弹最终引爆的所有炸弹,一定是一个区间。
这样就可以 DP 了,从每个 SCC 缩点做 DP,求出每个 SCC 引爆的左端点和右端点。
SGU268: n-SAP
定义 P: 长度
给定两个 P
记这个 SAP 为
可以尝试构图
建完图,求
但是这样太慢了,点边太多了,点就至少是阶乘级别的。
观察:对于类 P,在图中的前驱、后继都只有一个。(缺哪个添哪个)对于 P,后继不为
那么在
观察:
但这还是没法帮忙优化到通过。接下来是重头戏。
考虑把每个
观察:
我们现在把每一个环的状态看作一个结点。则原来的终点现在对应很多个环(这些环本质相同,但是旋转了)。答案变成了到这些环的最短路取
研究对于固定的一个起点一个终点怎么求。
设起点
我们要移动次数最少,也就是
顺时针最少,也就是所有非 的逆时针最少。
显然有一个下界:
尝试构造一个方案达到下界。
这张图所有点出入度都为
我们只需要让
Dining
建图分三个部分:左边食物,中间奶牛,右边饮料。
每只奶牛拆成入点出点。每个奶牛喜欢的食物向这只奶牛的入点连边,入点向出点连
Steady Cow Assignment
二分这个差值,然后枚举最小的不满意度是多少,可以得出每只牛要位于它心中
建图:
电影迷
数字梯形问题
问题一:入点出点。
问题二:连出入点都不用了,要注意第
问题三:把问题二中所有连边容量改成
修车
注意一个事情:并不是所有车的修理时间都会叠加,只有同一个师傅修的车会叠加等待时间。
平均用时最小 = 总用时最小。
一般的思路是 总用时 = 第一辆车等待用时 + 第二辆车等待用时 + ...
这么做是做不出来的,应该用 总用时 = 第一辆车修理用时*n + 第二辆车修理用时*(n-1) + ...
把每辆车抽象为一个结点,(第
每辆车
所有 “第
跑最小费用最大流,最小费用就是最小总等待时间。
美食节
是修车的加强版。但是建边的思路还是和上题一样。
直接把图全建了,复杂度过高。这时候做一个优化:因为每一个厨师所代表的一系列点,一定是先用了倒数第一,再用了倒数第二 ……
所以我们没必要一开始就把每个初始对应的所有做菜位置的点全建了,初始每个厨师只放一个倒数第一的点,这个点被流了,再加倒数第二的点 …… 这样就行了。
旅行 加强版
翻译:遍历给定基环树(如果是树很简单)。遍历规则:可以从后继中选一个未访问的前进,或者沿第一次访问该结点的边回溯。求最小字典序的 DFS 顺序。
即可以去掉一条环边,然后求最小 DFS 序。注意字典序是有小的编号一定会走。
肯定从
放弃环边需要的条件:
-
以前没放弃过环边。
-
环边指向的点是这个点遍历的最后一个点。否则如果直接回溯,后面就回不来这个点了。
-
从此处回溯之后下一个到达的点比环边指向的点小。
综上,先把所有点邻点排序,再基环树找环,最后遍历。
关键代码细节挺多的。
bool f[500005] = {}, flag = false; //f是访问标记,flg=true表示放弃过环边
//当前点x,父节点pr,若当前点回溯,下一个访问会nx
void srh(int x, int pr, int nx) {
f[x] = true;
cout << x << " ";
for (int i = 0; i < e[x].size(); i++)
if (!f[e[x][i]]) {
// x->e[x][i]是环边且 以前没放弃过
if (cir[x] && cir[e[x][i]] && !flag) {
//若e[x][i]不是最后一个邻点,则不可以放弃,必须前进
if (i < e[x].size() - 1 - (pr > e[x][i])) //注意父节点的影响
srh(e[x][i], x, e[x][i + 1] == pr ? /*注意这里父节点不要被算!*/e[x][i + 2] : e[x][i + 1]); //修改回溯访问的结点
//如果放弃了反而更差,就不放弃
else if (nx > e[x][i])
srh(e[x][i], x, nx);
//否则从这里直接回溯
else
flag = true;
}
else
srh(e[x][i], x, nx);
/*
这里也可以写作 srh(e[x][i], x, inf)
因为进入这里说明不是环边,不是环边也就不允许放弃(只能自然回溯),也就不会用到nx
*/
}
}
Island
翻译:求出基环森林中,每颗基环树的直径之和。(带权)
考虑一颗基环树怎么求直径。
先用深搜树找环,记那个环在深搜树中深度最浅/深的结点为
直径分为两类:一类过
对于过
记
于是可以枚举
但是还有一种情况没考虑:若 (虽然不考虑这种情况疑似还有 80)
法一:用类似换根 DP 的方法,单独处理出
法二:仍沿用树形 DP 的思路。
那么
注:这一题会有重边,但是重边其实只会用重边中边权最大的。
注2:求不过
航班安排
把每个请求抽象为一个点,“每个请求只有一次” 启发我们把每个请求拆成入点出点。
之后就比较简单了,源点
若对于某个请求,机场若能在
请求之间也连边,若某个请求结束时的飞机可以赶到另一个请求的开始,则这个请求的出点向那个请求的入点连边,容量
单个请求的入点向出点连边,容量
跑最大费用流。
剪刀石头布
考虑用
进而我们发现对于一个点若入度为
我们要“不是环的三元子图”尽量少。
用已经定向的边统计每个点的初始入度 ans -= d[x]*(d[x] - 1)/2
。
接下来建图。
先对每一个点
这里一个技巧就是我们要数量最小,所以在网络流的时候一定会优先流费用小的边。
再对每一条没确定方向的边
跑最小费用最大流,得到的结果就是 将边定向后,多出来的非环三元组的个数 最少是多少
,让
航空路线问题
建图:因为要求了城市只能经过一次,所以很自然想到入点出点的建模。除了起点终点的入点向出点连的边容量为
对于输出方案,在残余网络上做两次搜索即可。
方格取数问题
将棋盘黑白间隔染色,
Card Game
一个想法:先枚举等级,保留能用的卡。把所有和为质数的卡连边,然后就是求最大独立集。
怎么证明是二分图?
注意到质数除了
所以就是求二分图最大独立集,也就是 总能量 - 二分图最小点覆盖,而二分图最小点覆盖可以用网络流:最小点覆盖建图网络流,结点与源汇为权值,结点间无穷,跑最大流(最小割)
新生舞会
01分数规划 + 费用流判定。
爬山
显然是二分图。
如果点
否则先手必败。考虑另一个不包含
如何判断是否包含于所有最大匹配?先求一个最大匹配,如果
DAG 最小路径点覆盖
这里只讲怎么求最小路径点覆盖。
考虑一张二分图,把原图中每个点拆成两个点
结论:答案 = n - 此二分图的最大匹配。
证明:最终路径点覆盖的所有选中的边,一定在二分图中构成了一个匹配。这是因为最终的覆盖由很多链组成,不会出现一个点多条出边或多条入边的情况,所以对应到二分图中就是每个点不会匹配上两条边。
而观察发现,在路径覆盖中每条链的末端,对应在二分图中就是左部的一个未匹配点。
泥地
显然一个木板一定会顶到端点处。因此每一个泥巴格子只可能被两种木板覆盖:左右方向和上下方向。
处理出所有左右、上下方向的泥巴段,就算只有一个泥巴格子,也要分成两个泥巴段。把每个泥巴段抽象为节点。若两个泥巴段有重叠的泥巴格子,它们之间连边。
每个点代表一块木板,每一条边都代表一个泥巴格子。每个泥巴格子都要被木板覆盖,即每一条边都要被点覆盖。所以就是二分图最小点覆盖。
连续攻击游戏
把每个装备抽象为一个点,每个数字抽象为一个点。每个装备向它的两个属性连边。
然后跑匈牙利算法。从数字
这里还有一个小 trick: vis 每次 memset 太慢了,可以把 vis 改成 int 数组,同时记录一个当前轮数 id,在搜索的时候如果这个节点的 vis 不是 id,说明这一轮它还没动,其 vis 改成 id。
P4843 清理雪道题解
GDOI2024 考前模拟2 T2 题解
长脖子鹿放置
我们可以很轻易构造一个图:若两个格子能相互长脖子鹿攻击,则在它们之间连边。最终求这个图的最大独立集。
但是一般图最大独立集是 NP,所以我们想证明这个图是二分图。观察发现,如果把每一行黑白间隔染色,每种颜色只能攻击到另一种颜色。证毕。
P6185 题解
UVA1411 Ants 题解
CF1045C
每个点双内距离都是
CF510E
题意:
只狐狸,有年龄 ,要坐在一些圆桌边吃饭。要求每张桌子边至少 只狐狸,且相邻的狐狸年龄和为质数。找出一组解或判断无解。
如果两个数
因为是圆桌,每只狐狸都恰好与两只狐狸相邻,也就是每只狐狸匹配上两只狐狸。于是网络流建图(记
ARC080G Prime Flip 及其题解
分组作业
很好的一道网络流。
容易想到把每个人作为一个点,和 S,T 相连,割前面表示不同意,割后面表示同意。
本题难点在于 “合作” 和 “同意” 的区别。
这里最重要的想法就是把每一个组单独成立一个点,用来表示是否合作。 然后用每个人的点向组的点连
Order
一道简单的网络流,把每个任务建点,每个机器建点。
机器向 T 连边,容量为买的代价;S 向任务连边,容量为任务收入;任务向所需机器连边,容量为租机器费用。
所有收入 - 最小割 就是答案。
Underfail 及其题解
Incorrect Flow 及其题解
Good Transportation:最大流转最小割
题意:小明升任了 CF 国的大总管,他管辖的
个城市,编号为 。每个城市生产了 个货物,限制最多可以卖掉 个货物。对于每两个城市 ,如果 ,则可以最多从 运送 个货物到 。注意不能反向运送,却可以在多个城市之间送来送去。现在小明想知道,经过运输后,最多能卖掉多少个货物。
最大流建模非常简单但是慢了。但是我们转最大流为求最小割,而求最小割可以用 DP 做。
滚动数组压维可过。
Anti-Palindromize
题意:定义一个反回文串为反转后没有一个位置相同。给定一个
长度字符串 ,保证 是偶数。每个位置有一个价值 。
将的字符重新排列构成一个反回文串 。定义这个排列 的价值 。求 。
把
给每种字符建立一个结点,每个位置也建立结点。字符串重新排列看做字符流到位置上。
为了使两个对应位置不相等,也就是一种字符的结点不能同时给到两个位置流。新建一个结点
如果对应位置刚好是对应字符,在
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!