进阶网络流技巧
零、基本概念
- 图的匹配:选出图上的一些边,使得两个边之间没有公共端点。
- 图的独立集:选出图上的一些点,使得两个点之间没有连边。
- 图的点覆盖:选出图上的一些点,使得每条边都至少有一个端点被选择。
- 图的边覆盖:选出图上的一些边,使得每个点都至少有一条连边被选择。
- 闭合子图:选出图上的一些点构成子图,使得这些点的连边都连向子图内部。
- 图的路径覆盖:在 DAG 上用不相交的简单路径覆盖所有节点。
- 图的割:选择一个边集,使得将这些边删去后,源汇不连通。
一、一些定理
1)最小割最大流定理
即有源汇图的最小割与最大流相等。
最小割的构造:在跑最大流后的残余网络上,从源点开始沿非 边进行 dfs,标记为集合 。则一端在 集中一端不在的边构成一种最小割。
模板例题:P4662 [BalticOI 2008]黑手党.
P4126 [AHOI2009]最小割
有向图,定义最小路径切断方案为,在切断路径代价之和最小的前提下,使得切断路径之后的点 不再连通。对于每条边,求:
- 是否存在最小路径切断方案,其中该边被切断?
- 是否对任意最小路径切断方案,都有该边被切断?
首先当然是在原图上跑一遍最小割,考虑怎么在残余网络(包括反边)上做些什么。
先来考虑第一问,思考若某条边 可以被切断,应该满足什么条件。
- 残余网络上该边剩余流量一定为 。因为若仍有剩余,一定可以选择花更少的代价切掉剩余流量为 的边而不是切掉 。
- 一定不在一个强连通分量当中。否则我们可以将流量绕环转一圈,最大流不变的情况下 的满流会被破坏。
于是跑一遍 tarjan 之后判一下即可。
对于第二问, 需满足条件:
- 残余网络上该边剩余流量一定为 。原因和第一问相同。
- 一侧的节点可以被 到达,另一侧的节点可以到达 。此时 为该路径上权最小的边,显然一定会被删去。这条也可以该为判定是否一侧和 在一个强连通分量内,另一侧和 在一个联通分量内。
2)二分图概念相关定理
1. 最小点覆盖 = 最大匹配
最小点覆盖即,二分图点数最少的一个点覆盖。
- 最小点覆盖不少于最大匹配
最大匹配所选择的边互不相交,故对于最大匹配所选的每一条边,都至少要有一个端点被选择。
- 最小点覆盖的值可以取到最大匹配值
可以构造如下方案:对于每一个节点,若其连边都未被选择,则不选该点;若其连边有的被选择有的未被选择,则优先选择该点;若其连边都被选择,且未连接到被选择的节点,则也选择该点。
如此便可以使得最小点覆盖与最大匹配相等,证毕。
2. 最大独立集 = 总点数 - 最小点覆盖
最大独立集即,二分图点数最多的一个独立集。
- 最大独立集可以取到 总点数 - 最小点覆盖
将上述最小点覆盖的构造方案取补集,即可构造出最大独立集方案。可以证明,所选节点一定是原图的一个独立集。
具体来说,对于一条边,若其被点覆盖,则相邻两点之间一定选择了一个节点,而取补集之后,就变成最多只选择一个节点,故得证。
- 该独立集一定最大
由于最大独立集和最小点覆盖之间的补集关系,若最大独立集可能更大,则最小点覆盖一定可以更小,故该独立集一定最大。
综上,我们称最大独立集和最小点覆盖是对偶问题。(对一般图同样成立)
3. 最大权闭合子图 = 正权点和 - 最小割(构造图上)
最大权闭合子图即,点有点权,可正可负,选出点权总和最大的闭合子图。
容易想到,正权点的贡献是其权值,代价是若选择该点,必须要选择与其相连的正权点和负权点。
故可将源点连向正权点,流量为权值;负权点连向汇点,流量为其权值的绝对值;保留原图边,边权为 INF。
则此时答案为所有正权点和与跑出的最小割之差。建图含义就是,在拿到所有正权的情况下,要不放弃正权点,要不选上负权点。
故由含义得,最大权闭合子图的构造方案是,残量网络上未流流量的正权点与流尽流量的负权点所构成的集合。
4. 最小路径覆盖 = 总点数 - 最大匹配(构造图上)
最小路径覆盖即,选择尽可能少的路径,覆盖原图所有节点。
注意到,根据路径覆盖的定义,每个节点最多只能有一个入度,最多只能有一个出度。
故我们可以将每个节点拆成两个点,分别表示连向别人的节点和被连的节点,扔到二分图的左右两侧,用源点汇点相连,并保留原图边,流量都为 。
考虑将两个点之间的边被选择看作是合并两点,那么最小路径覆盖其实就是,剩下尽可能少的连通块。故跑二分图最大匹配后,用总点数减去,即为最小路径覆盖。
由图的含义,构造方案显然。
3) 定理
设二分图左侧有 个点,右侧有 个点。不妨设 ,则有:
二分图存在完美匹配 ,均满足从左侧选出 个点,连向右侧的点集大小不小于
二分图完美匹配:匹配数为 。
正确性十分显然。
推论:设左侧点集 连向右侧的点集为 ,则二分图最大匹配数为 。
1. P3488 [POI2009]LYZ-Ice Skates
滑冰俱乐部初始有 到 号码溜冰鞋各 双,已知 号脚的人可以穿 到 号码的鞋子。
现在有 次操作,每次两个数 、,表示 号脚的人来了 个, 为负表示离开。对于每次操作,输出溜冰鞋是否足够。
,,.
很容易想到将人和溜冰鞋一起建二分图,傻瓜式连边,并对于每次操作都跑一遍最大流,但这时间复杂度显然爆炸!
由于题目只询问是否存在完美匹配,所以考虑使用 Hall 定理。
设 为当前脚码为 的人数。由 Hall 定理可知,若该二分图存在完美匹配,则有:
不妨将右侧常变量分离,则有:
于是我们动态维护所有区间 的最大值,每次询问时判断是否大于 即可。
用线段树可以做到 .
2. CF981F Round Marriage
个新郎和 个新娘围成一个环,长度为 ,第 个新郎位置为 ,第 个新娘位置为 ,需要将他们两两配对,最小化新郎和新娘距离的最大值。
,.
首先根据 "最小值最大",先二分答案,考虑如何判定「当新郎可以和距离其 以内的新娘配对时,是否存在完美匹配」。
又观察到了「完美匹配」,考虑使用 Hall 定理。
首先断环成链,设第 个新郎向左可以匹配到第 个新娘,向右可以匹配到第 个新娘。由于单次判定对于每个新郎的 值相同,故可以利用单调性 求出每个新郎的 值。
那么根据 Hall 定理,有:
观察到该式子只和 有关,考虑将 拆开:
于是从左向右扫时,动态更新之前所有 的最大值,判断是否不大于当前 即可。
注意断环时将 拆成两份,将 拆成四份,才能便捷地在处理中表示所有情况。
时间复杂度 .
3. Loj6062.「2017 山东一轮集训 Day2」Pair
给出一个长度为 的数列 和一个长度为 的数列 ,求 有多少个长度为 的连续子数列能与 匹配。
两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对当且仅当它们的和不小于 。
,.
不妨将 数组降序排序,则对于每一个 ,对应的连边区间都为 数组的一个前缀。
所以对于 中每一个长度为 的区间,都会在 中对应 个前缀。
设区间内值为 的 的个数为 。根据 Hall 定理,此时需要满足的约束是:
于是考虑使用权值线段树进行维护,初始将线段树第 个位置的值设为 。对于每一次区间移动,设需要修改的值为 ,则在线段树上修改区间 即可。
判定时查询线段树最大值是否大于 ,并计数。
时间复杂度 .
4. CF1009G Allowed Letters
给定一个长为 的串,字符集 。你可以重排这个串,满足指定 个位置上只能放特定的字符, 个位置以及字符集会给出,求字典序最小的串。
,保证 个位置互不重复。
观察到字符集很小,考虑到在字符集上做文章。
不妨从 到 枚举每个位置都填什么字符,对于当前决策字符 ,若填完 后,对于后面的位置,满足对于完美匹配的判定,则说明 合法,可以填 。
于是问题就在于,如何高效判定完美匹配。
具体地,根据 Hall 定理,若存在完美匹配,需满足选出字符集的一个子集后,设子集中余下需填字符总数为 ,剩下位置中还可以填这些字符的位置总数为 ,则需要满足 。但暴力判定这个,单次复杂度仍然是 的,炸炸炸!
但是注意到,每次填完一个字符之后,对于每个子集的 和 来说是好维护的。于是可以考虑作一个简单的状压 dp,将字符集选择状态压起来,每次填写后,动态维护 和 ,如此便可以做到 判定了。
故最终时间复杂度为 ,其中 .
5. [ARC076F] Exhausted?
个人, 张椅子,第 个人可以坐在前 椅子上或者后 个椅子上,每个人只能坐一把椅子。求最少有几个人坐不到椅子。
,.
首先自然可以想到网络流,使用前后缀优化建图可以拥有较为优秀的复杂度,但是数据范围太大,很难通过本题。
于是考虑使用复杂度更为优秀的类网络流解法,使用 Hall 定理的推论解决本题。
人的集合不好枚举,我们可以考虑枚举枚举前 个椅子和后 个椅子构成的区间所完全包含的人数。但这仍然是 的。
观察到这其实是二维数点,每次询问其实就是在查询 且 的人数。
于是可以考虑采用扫描线消维的方式,枚举 ,用线段树维护 上的最大值,将 的所有 扔到线段树里;同时由于 的向右扩展, 左范围默认向右移动。随着扫描的进行动态维护最大值即可。有一些简单的细节需要处理。
时间复杂度 .
二、上下界网络流
上下界网络流相关做法的本质是利用源汇外每个节点的入流量和出流量相等,以及源点出流量与汇点入流量相等的流守恒性。
1)无源汇上下界可行流
上下界网络流的基本套路是,将每条边的流量直接赋为流量下界,容量限制赋为上界与下界之差。
这样无论每条边怎么流,都一定不会超出上下界容量限制。
但是这样有个问题,就是如果直接这么搞,对于每个节点来说入流量和出流量就不等了,这显然是很不合理的。
所以我们需要建立一对虚拟源点汇点,并对于每个节点,计算它的入流量与出流量之差。
- 如果入流量大于出流量,我们需要让它成为源点,向外流出入流量与出流量之差的流量。为了方便,我们让虚拟源点连向它。
- 如果入流量等于出流量,就不用管了。
- 如果入流量小于出流量,我们需要让它成为汇点,流进出流量与入流量之差的流量。为了方便,我们让它连向虚拟汇点。
然后从虚拟源点向虚拟汇点跑最大流,记所有虚拟源点连出的流量为 ,得到的最大流量为 ,若 ,则该图有可行流。
2)有源汇上下界可行流
与无源汇相比,有源汇的区别在于对于源点和汇点的流量限制,即,源点和汇点的入流量和出流量可以不同,但是源点的出流量必须与汇点的入流量相同。
所以我们可以考虑在无源汇的基础上,从汇点向源点连一条容量限制为 INF 的边,即可同时满足上述两条额外限制。
之后正常从虚拟源点向虚拟汇点跑最大流。原图的可行流量即为 INF 边的流量。
3)有源汇上下界最大流
在上一节,我们已经得到了一个可行流,且该可行流对于最大流量的贡献就是 INF 边的流量。
但这显然并不是最大流。
除此之外,我们还需要在残量网络中,在删掉 INF 边的基础上,从源点向汇点再跑一遍最大流。
则最终的最大流就是第二遍网络流的流量与之前 INF 边的流量之和。
例题:Loj116. 有源汇有上下界最大流 P5192【模板】有源汇上下界最大流
4)有源汇上下界最小流
与最大流类似。
在跑完可行流之后,我们还需要在残量网络上进行一次「退流」的操作,即在删掉 INF 边之后,从汇点再向源点跑一遍最大流,将一些流量还给源点。
则最终的最小流为之前 INF 边的流量与第二遍最大流的流量之差。
5)有源汇上下界最小费用可行流
和有源汇上下界可行流类似,先将所有边的流量都调为容量下界,容量限制都调为容量上界与下界之差,并记所有容量下界流量费用之和为 .
接着建立虚拟源点汇点,从虚拟源点向虚拟汇点跑费用流,平衡流量,记最小费用为 。
则最终可行流的最小费用为 .
6)无源汇上下界最小费用可行流
类比 (1)(5) 即可。
不过注意如果可能出现负费环,需使用下述文章中出现的「有负圈的费用流」解决。
7)例题
1. P4542 [ZJOI2011]营救皮卡丘
个节点, 条双向边,初始 个人在 号节点。到达第 个节点的前提是有人到达了前 个节点。
求有人到达第 个节点时, 个人所经过道路的最短长度。
,,。
「到达第 个节点的前提时有人到达了前 个节点」这个限制的作用是,随着节点的解锁,两点间的最短路可能会发生变化。
我们不妨强制每个人只能向编号更大的节点走,那么当某个人从第 个节点走到了第 个节点时,说明第 到第 个节点已经被走过了,即,从第 个节点到第 个节点的代价是只经过前 个节点的最短路。
所以我们可以考虑 Floyd 预处理出 「只经过前 个节点的所有 之间的最短路」。
连边时,将每个点拆成两个点,中间连一条下界流量为 的边表示对于每个点的下界限制,并将可以到达的两点之间都连上边,费用为最短路权。
最终答案为可行流的最小费用。
2. P4311 士兵占领
有一个 的棋盘,有的格子是障碍。选择一些格子来放置士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵。我们称这些士兵占领了整个棋盘当满足第 行至少放置了 个士兵,第 列至少放置了 个士兵。求占领整个棋盘需要的最少士兵个数或宣告无法占领。
。
考虑这种行列覆盖问题的一般套路,即把每一行放在二分图的左侧,每一列放在二分图的右侧,行列之间的连边代表每一个非障碍格。
那么 和 的限制就限制了源点汇点连向两侧的容量限制下界。
于是跑有源汇上下界最小流即可。若没有可行流则输出无解。
另一种做法是,将「至少」转换为「最多」,将「最小流」转化为「最大流最小割」,跑出「最多舍弃多少格子」,则答案为 。
无解需要特判。
3. P4194 矩阵
给定 的矩阵 ,求一个 的矩阵 ,满足 ,,,且使得下式值最小:
,.
「最大值最小」,先二分答案 。
于是我们便得到了每一行和每一列 总和的上下界,即 。
所以继续考虑行列相关问题的套路,将行和列分别扔在二分图的左右两侧,第 行与第 列之间的连边表示 ,容量限制为 .
于是对于每一次判定,跑一遍有源汇上下界可行流即可。
4. CF1288F Red-Blue Graph
有一张二分图,左边有 个点,右边有 个点, 条边。每个点可能有一种颜色
R
或者B
,也可能没有,也就是U
。现在要给一些边染色,把边染成R
要花费 的代价,把边染成B
要花费 的代价,要求对于每个颜色为R
的点,与之相邻的边中R
的边严格多于B
的边;对于每个颜色为B
的点,与之相邻的边中B
的边严格多于R
的边。求花费最小的方案,输出任意一种,无解输出−1
。.
本题就是利用上下界网络流本质的一个极好的例子。
思考每一条边的作用。事实上,对于一条被染色的边,只会对其连接的两个节点产生影响。
考虑到只有黑白染色,我们完全可以将边的颜色映射到流量方向上,将边流量的两个方向分别看作 R
和 B
。从左向右流看作 R
,从右向左流看作 B
。
则对于左侧点:
- 对于
R
点,即限制入流量比出流量少 ,即可以作为新图的源点,多流出 的流量。建图上从新源点向其连一条下界为 的边。 - 对于
B
点,即限制入流量比出流量多 ,即可以作为新图的汇点,多流入 的流量。建图上从其向新汇点连一条下界为 的边。 - 对于
U
点,无任何限制。建图上分别从新源点新汇点与其连边。
对于右侧点:
- 对于
R
点,即限制出流量比入流量少 ,即可以作为新图的汇点,多流入 的流量。建图上从其向新汇点连一条下界为 的边。 - 对于
B
点,即限制出流量比入流量多 ,即可以作为新图的源点,多流出 的流量。建图上从其向新源点连一条下界为 的边。 - 对于
U
点,无任何限制。建图上分别从新源点新汇点与其连边。
对于原图连边,从左向右连边费用为 ,从右向左连边费用为 。
之后跑有源汇上下界最小费用可行流即可。
5. CF708D Incorrect Flow
给定一张 个点 条边的网络,源点为 ,汇点为 。对于每条边,有容量 ,当前流量 。但这个图是错误的,可能存在 ,或者流量不守恒的情况。
你每次操作可以将某条边的 或 加 或减 。请你用最少的操作次数将图变成一个正确的网络。
,, 没有入边, 没有出边。
这几道题都比较触及上下界网络流的本质。
对于每条边 ,考虑 与 的关系:
- 若 ,则说明该边流量当前合法。我们可以先将每条边的流量设为 ,除此之外,还可以有三种流量选择:
- 可以从 向 退流,上界为 ,费用为 。
- 可以从 向 推流,在不超过容量的前提下,上界为 ,费用为 。
- 可以从 向 超容量推流,费用为 。
- 若 ,则说明该边流量当前不合法。由于当流量为 时,一定会花费 ,所以我们可以先将每条边的流量设为 ,费用为 ,并预先支付 的费用。除此之外,还有两种选择:
- 可以从 向 退流,上界为 ,费用为 。
- 可以从 向 超容量推流,费用为 。
剩下就只需要建图跑有源汇上下界最小费用可行流即可。
三、有负圈的费用流
当图中存在负费用环时,spfa 会直接挂掉,导致无法顺利求解。
此时不妨考虑作个转换,将负费用边流量直接拉满,并建立其正费用反边。
即我们将负费用边 ,拆成了 与 。
此时我们就可以直接套用有上下界最小费用流直接求解即可。
不过此解法会将原图的性质破坏,也算是一大弊端。
除此之外还存在另一种消圈算法,不过由于效率较低,并不实用。
四、最小割树
最小割树用来快速求解任意两点之间的最小割。
若询问图中两点之间最小割次数较多时,可以考虑跑 次最小割建立最小割树 预处理, 直接快速查询。
具体来说,我们可以采用分治的方式构造整棵树。
对于每轮分治,我们任选两个点集中的节点作为源汇,跑一遍最小割,并将结果作为边权赋给边 。跑完最小割之后中,我们已经将原点集分成了两部分——与源点相连的 部分和与汇点相连的 部分。于是再分治分别处理这两部分即可。
构造方案证明如下:
-
设 为点 之间的最小割。当我们以 为源,以 为汇跑完最小割后,有:
原因显然,能割掉 的边集也同样能够割掉 ,故 可以作为 的上界。
-
对于网络上的三个点 , 中最小值一定出现了至少两次。
原因也很简单,不妨假设 最小,那么将 的最小割边集割开,设 所在的点集为 , 所在的点集为 ,不妨设 ,由 得,,于是 也是最小值。
由此有推论:
因为 和 之间必有一个最小值,所以显然成立。
故我们可以扩展得到 .
-
对于网络上的 个点 ,有 .
多次使用 可证。
-
综上所述,我们有:
对于最小割树上的两点 ,有 . 其中 为 到 路径上的节点。
由最小割树的构建过程知,设 为 ,则 ,而又由 知,,故我们可以得到:
即 .
故得证!
模板题:P4897 【模板】最小割树(Gomory-Hu Tree)
例题
1. P3329 [ZJOI2011]最小割
给定 点 边网络, 次询问,每次询问需回答「图中有多少个无序点对的最小割的容量不超过 」。
,,。
不妨先建立出最小割树,并 dfs 找到所有最小割。
由于 较小,可以考虑对于每次询问直接暴力计数,单次查询时间复杂度 .
当然也可以将所有最小割数值放入有序数组,每次询问时二分查找,此时单次询问可以做到 .
2. P3729 曼哈顿计划EX
给定 点 条边网络,点有点权,每次询问一个 ,需要找到一个点集,满足点集内所有点权之和不小于 的基础上,任意两点之间的最小割最小值最大。求满足条件点集内最大的最小割最小值,或宣告只需要一台计算机即可满足要求,亦或者没有办法满足要求。
,,.
考虑先建立最小割树。
最小割树上有一个性质是,对于一个连通块,两点之间最小割的最小值一定是该连通块中所有边权的最小值。
所以不妨按边权从大到小加入最小割树上的边,用并查集维护节点之间的连通性和连通块权值和。
同时将询问离线下来,从小到大排序,随着加边依次处理即可。
好像这种大数值询问包含小数值询问的多次询问都可以考虑离线排序之后依次处理?
3. CF343E Pumping Stations
个点 条边的带权无向图。你需要构造一个排列,收益为 。其中 表示图中 为源点, 为汇点的最小割。
求最大的收益,并输出方案。
,.
这种大规模用到最小割的题目大概率都需要最小割树吧。
考虑建立最小割树,那么两点之间的最小割实际上是被路径上权值最小的一条边所限制住的。
所以经过简单手玩之后发现,假设我们已经走了树上的一个连通块 ,那么对于 与其他节点相连的所有边,我们一定会选择最大的一条。
于是我们可以枚举起始节点作为初始的 ,不断选择权值最大的边前进并扩展 集合。最终选择最大的一个即为答案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现