网络流做题记录
1|0网络流做题记录
主要用来记录除了网络流24题之外的网络流题目。
1|1P4126 [AHOI2009]最小割
题意:对于每条边,求①这条边有没有可能在一种最小割中②这条边是不是一定在所有最小割中。
思路:首先看第一问。首先可以想到,如果一条边没有满流,那显然不能在最小割里。那如果满流的边一定在最小割里吗?其实不是。如果这两个点在同一个强连通分量里,那么可以让流沿着环流一遍,这样这条边就不满流了,不满足条件。于是,有可能在最小割里的充要条件是满流且两端不在同一个强连通分量里。
再看第二问,首先肯定也得满足满流的条件。其次,要满足源点可以到入点,出点可以到汇点,因为如果有一边到不了那说明在这条路径上存在一条同样可以被断掉的边,且也满足是最小割。因此可以推出,只有源点和入点在同一个强连通分量里,出点和汇点在同一个强连通分量里才能满足条件。这就是充要条件。
在实现上,先dinic再跑一编tarjan即可。
1|2P3731 [HAOI2017]新型城市化
题意:
思路:首先,因为题面中的限制,这个图可以被看成二分图,因此补图的最大团等于二分图最大独立集,证明可以考虑独立集里的点在原图中两两都有边,与一个团对应。又根据经典的结论,二分图最大独立集=点数-最小覆盖集=最大匹配,因此原题意就变成了求每条边删去后最大流是否改变。直接用上一题的做法即可。
1|3P5331 [SNOI2019]通信
题意:有
思路:首先有一个很明显的拆点后
1|4P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流
题意:(这题目怎么这么长) 有
思路:既然是模板那就按模板来写。
无源汇上下界可行流
这是上下界网络流中最简单的一种,给定一个没有源点和汇点、每条边的流量有上下界的流量网络,问是否存在一种可行流使得流量平衡,即每个点的流入量等于流出量。我们的做法是,把它拆成两个网络,一个每条边的容量是下界(下界网络),另一个每条边的容量是上下界之差(差网络),这时条件就是两个网络的流量之和是一种可行流。首先,下界网络肯定得满流,但是这样不一定是可行流,于是可以通过差网络把这些不平衡的地方补上。具体地,我们在差网络中新设一个源点和汇点,如果一个点在下界网络里流入量比流出量多
在代码实现的时候,不用把下界网络建出来,直接在差网络上跑就行。
有源汇上下界可行流
虽然是有源汇,但其实很简单。我们考虑,如果汇点向源点连容量为
有源汇上下界最大流
这才是一般在实际应用中使用的。要求最大流,我们可以在差网络中把附加边删掉,求残量网络的最大流,再加上之前的可行流就是答案。证明可以考虑我们新找的最大流一定是平衡的,再加上原来的可行流也是可行流。
在实现上,其实不需要真的把附加边删掉,因为除了汇点连向源点的边其他的都已经满流了,对答案没有影响,因此只需删汇点连向源点的边即可。
现在再来看这道题,其实建模很朴素,源点向每一天连
每一天向每个少女连
1|5P4843 清理雪道
题意:求有向图最小链覆盖,每条链可以相交。
思路:一开始以为就是最小链覆盖,结果样例一直过不去,手推出来发现确实有问题,然后才发现问题。考虑建模,每条边最少被覆盖一次,于是可以源点向每个点连容量为
有源汇上下界最小流
可以类比有源汇上下界最大流的做法,只是要从汇点到源点跑一遍最大流,再用可行流减去最大流就是答案。
1|6P4043 [AHOI2014/JSOI2014]支线剧情
题意:DAG最小链覆盖,要求每条链的开头是1号点,有边权。
思路:一开始以为就是上一题然后改流量,结果发现有边权不好处理。于是考虑用费用流。这时就需要用上有源汇上下界费用流
有源汇上下界费用流
其实理论上是有源汇上下界最小可行费用流,也就是不一定是最大流。
具体做法其实和前面的很像。对于一条边(确实是很像)
1|7P4553 80人环游世界
题意:
思路:一开始想的时候在最小费用最大流和有源汇上下界最小费用可行流之间纠结,然后写了后者,发现过不了样例,于是就去写前者,发现建模其实很简单,只是要额外建一个点表示哪些人从哪个城市开始就可以了。
1|8CF277E Binary Tree on Plane
题意:平面上有
思路:比较简单的费用流建模。拆点,源点向1连容量为(有人写zkw一直寄但是一改成EK就过了,比较离谱)。
1|9P5030 长脖子鹿放置
题意:给一个
思路:类似骑士共存问题,只是这次二分图判定标准是行(或列)的奇偶性。
1|10P4412 [SHOI2004] 最小生成树
题意:一张无向图,给定一棵生成树,求最小的修改边权的代价使得这棵生成树是最小生成树,代价定义为修改前后一条边的边权变化量的绝对值。
思路:首先,发现让这棵树成为最小生成树不好直接处理,但是判定是否为最小生成树却相对更容易。判定的思路也很简单,对于每一条非树边
显然,树上的边边权一定不会减小,非树边边权一定不会变大。于是对于一条非树边
由于不会写KM算法,就写了费用流。
1|11CF884F Anti-Palindromize
题意:对于一个字串
思路:一眼费用流,不过没想到可以直接暴力建边。
暴力建边就是建3层边,第一层是每个字符,第二层是二元组
1|12CF1288F Red-Blue Graph
题意:有一张二分图,左边有 R
或者 B
,也可能没有,也就是 U
。现在要给一些边染色,把边染成 R
要花费 B
要花费 R
的点,与之相邻的边中 R
的边严格多于 B
的边;对于每个颜色为 B
的点,与之相邻的边中 B
的边严格多于 R
的边。求花费最小的方案,输出任意一种,无解输出
思路:一眼流题,但是没想到竟是没写过的有源汇上下界费用流。
对于左边点,如果是R,那么由
最后连边
1|13CF1572D Bridge Club
题意:有
思路:牛逼题。
首先,容易发现是一个二分图,于是可以直接费用流。
正解就是发现
trick:每减少一条边最多会减少
1|14P3227 [HNOI2013] 切糕
思路:自己只想到了建满边的做法,不知道能不能跑过去。
正确的建边方法是建若干条链。具体地,对于每个
证明有点复杂,看不懂。
1|15P4298 [CTSC2008] 祭祀
题意:求 DAG 最长反链,求出一组解,判断每个点是否可能存在于最长反链上。
思路:好题。普及了很多之前不知道的和网络流相关的知识点(主要在构造方面)。
这一题要求出 DAG 最长反链,然后构造方案,并求出每个点是否可以在最长反链中。
首先,根据
然后考虑怎么构造最长反链。首先考虑怎么构造二分图最大独立集。假设我们已经求出了最大匹配:
然后我们从右侧的未匹配点出发,每次只走非匹配边到左侧,只走匹配边到右侧,然后选取左边被走到的点和右边未被走到的点,发现这些点就是最小点覆盖:
而最大独立集就是最小点覆盖的补集,于是左边未被走到的点和右边被走到的点就是最大独立集:
回到原题,可以证明一个点拆成的两个点如果都在最大独立集里那么这个点在最长反链上,于是可以求出第二问。
然后是第三问,删掉一个点和其相连的点后,如果最长反链只减小了 1 就表示这个点能在最长反链中。
1|16[ABC225G] X
题意:给定一个矩阵,你可以选定一些格子,得到这些格子的权值,但是你需要在这些格子中画 X,即连接两条对角线,但是对于格子
思路:因为是选或不选,考虑用最小割建模,即用总和减去最小割。那么要最小化不选的权值和画线的代价。
首先源点向每个点连
对于一条连续选择的斜线,代价只用加在一处,于是可以把每个点向斜线前一项连一条容量为
1|17CF793G Oleg and chess
题意:有一个
思路:线段树优化建边 + 网络流。
在这个限制下,每列的范围是若干区间,可以考虑用扫描线,然后新建点向这一列连边来优化建边,点数大概是
1|18P1963 [NOI2009] 变换序列
题意:给定
思路:可以把
在此题中,每个点左部点最多连两条边,所以直接倒着匹配就是字典序最小的方案。
1|19P2805 [NOI2009] 植物大战僵尸
题意:给定一个
思路:容易发现这就是最大权闭合子图的模型。最大权闭合子图是每个点有权值,如果要选择一个点就要选择这个点的所有出边,要求最大权值。
做法是对于每个点,如果权值非负,就由源点向这个点连边,否则就向汇点连边,边权就是点权的绝对值,然后对于原图中的边
为什么这样做是对的呢?首先,能被割掉的边一定是连向原点或者汇点的边,那么考虑与
回到这题,我们发现几乎是一样的,但是问题在于可能会出现环,于是可以建反图跑拓扑排序来去掉环的影响。
1|20CF1666K Kingdom Partition
题意:有一张图,你需要把点划分成 ABC 共 3 个部分,对于每条边,记边权为
- 如果连接两个 A 部分的点,代价是
- 如果连接两个 B 部分的点,代价是
- 如果连接 AC 两个部分的点,代价是
- 如果连接 BC 两个部分的点,代价是
求最小代价。
思路:一眼最小割模型,但是因为有 3 个部分不好建模。
我们把代价画出来,发现十分对称:
我们考虑把每个点
这时我们发现 ST 与 A 划分的代价相同,TS 与 B 划分代价相同,SS、TT 划分代价与 C 相同,这样就可以直接跑最小割来解决了。
1|21P8501 [NOI2022] 二次整数规划问题
题意:求一个序列
- 每个位置有限制
,其中 。 - 有若干个限制,表示
。
同时给出长为
思路:绝世好题。
就从部分分开始吧。
k=3
发现一个性质,就是如果一个元素的取值不固定,那么一定取 2 最优。
证明比较简单,因为把一个元素变成 2 不会影响第二类限制是否满足,而且这样不会让
于是就可以在
k=4
考虑能否延用
这时有一个结论,对于任意的
证明和上一个证明类似。
于是这时就只需判断每个元素是取 2 还是取 3。这时它们之间对 G 的贡献是一定的,于是每个数取 2 和取 3 对答案的贡献是线性的,于是一定是全取 2 或者全取 3 更优。
不过在确定每个元素的取值范围是要注意必须取 1 和
特殊性质 A
因为选的数之间没有限制,因此需要考虑的取值范围只有
此时有结论,对于取值范围相同的元素,它们都取同一个数是最优的。于是只有
复杂度
特殊性质 B
这时可以考虑暴力枚举每个被限制的元素的取值,考虑在有限制的变量之间连边,那么对于每个连通块,
复杂度
∑q 较小
我们可以把对
特殊性质 C
通过上一个做法,我们不难想到可以求出所有可能作为最优解的二元组
对于 100% 的数据
从特殊性质 C 我们不难发现,我们只关心哪些二元组
我们先把答案写成只有
我们把二元组
这时已经确定了的有左下、左上、右下 3 个点,于是只要矩形最后不是全部落在第三象限,取这 3 个点都最优,于是只用考虑矩形全部在第三象限的情况。
因为是坐标乘积最小,不难想到凸包,那么我们就需要求出凸包上的所有点,于是可以用 [BalkanOI2011] timeismoney | 最小乘积生成树 的做法——分治求凸包上的点。具体地,假设当前要找到在
那么问题就是每个元素取 2 有
于是考虑建立最小割模型。我们把每个元素拆成 2 个点
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/17391970.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】