网络流常见模型与技巧

sto louis & Maverik orz!

写一些知识点,图论杂题过后单独开一篇。(upd: 高估了图论杂题的数量,看起来凑不够一篇,那不开了。

最小割

最大流最小割定理

对于任意网络 G = ( V , E ) G = (V, E) G=(V,E) ,其上的最大流 f f f 和最小割 { S , T } \{S, T\} {S,T} 总是满足 ∣ f ∣ = ∣ ∣ S , T ∣ ∣ |f| = ||S, T|| ∣f∣=∣∣S,T∣∣ 。

即,最大流在数值上等于最小割。

最小割的可行边与必须边

同一个网络的最小割有多种可行的方案,我们需要对一条割边的可行性与必要性进行讨论。
可行边 : 指存在于任意可行割集中的的边。
必须边: 指存在于所有可行割集中的的边。

可行边

一条边 u → v u\to v u→v 作为最小割的可行边的充要条件是:

  • 这条边满流
  • S C C u ≠ S C C v SCC_u\neq SCC_v SCCu=SCCv

第一条限制的必要性是显然的,我们来证明第二条限制。
u u u 和 v v v 不在同一强连通分量,等价于残量网络上不存在一条从 u u u 到 v v v 的路径。如果存在一条从 u u u 到 v v v 的路径,就会和 u → v u\to v u→v 满流后形成的反向边构成环,破坏了最大流的性质, u → v u\to v u→v 必然不能是可行边。

必须边

一条边 u → v u\to v u→v 作为必须边的充要条件是:

  • 首先它是一条可行边
  • S C C s = S C C u , S C C v = S C C t SCC_s=SCC_u,SCC_v=SCC_t SCCs=SCCu,SCCv=SCCt

后者等价于残量网络上同时存在 s → u s\to u s→u 和 v → t v\to t v→t 的路径。如果不存在,则说明只割掉前面(或后面)所有满流的边就能令 s s s 和 u u u 不连通(或 v v v 和 t t t),这样 u → v u\to v u→v 就不是必须要割的边。

最大权闭合子图

闭合图 :一个有向图的子图,满足若一个点在该子图内,则它的所有后继节点都在该子图内。
最大权闭合子图:一个带点权的有向图,点权有正有负,求一个闭合子图的权值和的最大值。

做法

这是一个较为经典的问题。

考虑如下的建图:将点按照点权的正负分为正值点和负值点。源点向所有正值点连边,容量为点权;所有负值点向汇点连边,容量为点权的绝对值。在正负值点之间按照原图连边,容量为 inf ⁡ \inf inf。

答案为正值点的权值和减去原图的最小割。

证明

考虑这样建边的实际意义,设 s → i s\to i s→i 的边不割表示选了这个正值点, i → t i\to t i→t 的边不割表示不选这个负值点。

那么 s → t s\to t s→t 连通就表示选了某个正值点但没选它后继的负值点,于是寄了。我们的目标是用最小的代价让它们不连通,这就是求最小割。

为什么不用反过来考虑呢?因为如果一个负值点被选,一定因为它是某个正值点的后继而不得不选。所以选的第一个点一定是正的。

CF311E Biologist

不会做 *2300 /oh。

首先完不成要倒扣的限制可以通过把达成条件的奖励加 g g g 来消去。然后对求的东西进行转化,最大化利润等价于最小化未获得的奖励+成本。

因此这样建图:

  • 若 S i = 0 S_i=0 Si=0,连边 ( i , t , v i ) (i,t,v_i) (i,t,vi),割掉该边表示选 1 1 1 要花费 v i v_i vi 的代价;否则连边 ( s , i , v i ) (s,i,v_i) (s,i,vi)。
  • 对每条限制开一个新点。如果限制是全为 1 1 1,即限制某些位置不能有 0 0 0,连边 ( s , j , w j ) (s,j,w_j) (s,j,wj), ( j , x , inf ⁡ ) (j,x,\inf) (j,x,inf);否则连边 ( j , t , w j ) (j,t,w_j) (j,t,wj), ( x , j , inf ⁡ ) (x,j,\inf) (x,j,inf)。如果割开限制边,则表明该奖励没有被达成。

这样建图可以保证一个点不会既满足 0 0 0 限制又满足 1 1 1 限制,因为这样这两个限制的边会通过这个点连通。

混合图的欧拉回路 Euler Circuit

与有向图、无向图的欧拉回路不同,在混合图中,我们需要对所有无向边进行合理的定向,使之转化为有向图求解。

先对所有边随机指定一个方向,令点的权值 d i = i n i − o u t i d_i=in_i-out_i di=ini−outi。我们希望通过调整边的方向,使所有 d i = 0 d_i=0 di=0。

考虑将原本 u → v u\to v u→v 的边反向,对 d d d 数组的影响是 d u ← d u + 2 , d v ← d v − 2 d_u\gets d_u+2,d_v\gets d_v-2 du←du+2,dv←dv−2。因此我们把 d d d 数组全部除以 2 2 2,一次反向操作的贡献变为 1 1 1。

对于 d i > 0 d_i>0 di>0,连边 ( s , i , d i ) (s,i,d_i) (s,i,di);对于 d i < 0 d_i<0 di<0,连边 ( i , t , − d i ) (i,t,-d_i) (i,t,−di)。对于原图的每条无向边 u → v u\to v u→v,连边 ( u , v , 1 ) (u,v,1) (u,v,1)。跑最大流,流满的边即为需要反向的边。

对所有边定向完毕后,跑有向图的欧拉回路即可。

费用流

那个长得神似 Dinic 的费用流其实叫 zkw 费用流。

[CQOI2012] 交换棋子

网络流题总是能写出层出不穷的假做法,怎么办呢。

忽略掉所有白棋子,那么问题相当于每次可以八连通移动,将黑棋子移动到指定的位置。次数限制在方格上,考虑拆点,连边 ( i n x , y , o u t x , y , l i m i t , 0 ) (in_{x,y},out_{x,y},limit,0) (inx,y,outx,y,limit,0), l i m i t limit limit 是交换次数限制的一半,特判下奇数且初始/终止为黑的点。

对于初始位置的黑棋子,连边 ( s , i n x , y , 1 , 0 ) (s,in_{x,y},1,0) (s,inx,y,1,0);对于终止位置的黑棋子,连边 ( o u t x , y , t , 1 , 0 ) (out_{x,y},t,1,0) (outx,y,t,1,0)。每个格子向八连通位置连费用为 1 1 1 的边,表示交换,跑费用流。

然后这个假了,原因是要特判某个位置一开始就是黑的,最后还是黑的。这种情况不应当连边,因为它一直不动的话没有交换次数,不会贡献大小为 1 1 1 的流。

[NOI2012] 美食节

P2053 的加强版。这人怎么不仅不会网络流,还不会拆贡献 /cf

发现做每个菜的贡献跟前面做菜的总时间有关,试图倒过来考虑。设第 i i i 个菜是第 j j j 个厨师倒数第 k k k 个做的,它对答案的贡献是 T i , j × k T_{i,j}\times k Ti,j×k。

至此,不同菜或厨师之间的贡献独立。比较暴力的做法是直接把每个厨师拆成 p p p 个点,分别表示这个人倒数第几次做菜,跑费用流,可以通过 P2053。

不过发现,我们只有先做了倒数第 i i i 个菜,才有可能做倒数第 i + 1 i+1 i+1 个菜,否则一定不优。因此可以在 dinic 的过程中动态加边,每次增广后判断,等到倒数第 i i i 个已经被选,再连边第 i + 1 i+1 i+1 个。这里要每次增广就判断一次,而不是全部增广完毕再加边。后者会使图中出现负环。

[WC2007] 剪刀石头布

双倍经验:CF1264E Beautiful League

直接对三元环计数,发现没法做。反过来对无法形成环的三元组进行计数,那么目标是最小化这样的三元组数量。

考虑一个无法形成环的三元组有什么性质,发现它有且仅有一个点出度为 2 2 2。同时我们发现这是判定一个三元组非法的充要条件,所以我们要对这样的一个点和两条边数数。

设 d e g i deg_i degi 表示点 i i i 的出度,那么点 i i i 对应的非法三元组数量为 d e g i ( d e g i − 1 ) 2 \frac{deg_i(deg_i-1)}{2} 2degi(degi−1)。问题转化为给所有无向边定向,最小化 ∑ i = 1 n d e g i ( d e g i − 1 ) 2 \sum\limits_{i=1}^n \frac{deg_i(deg_i-1)}{2} i=1∑n2degi(degi−1)。

给无向边 ( u , v ) (u,v) (u,v) 定向,要么使 d e g u ← d e g u + 1 deg_u\gets deg_u+1 degu←degu+1,要么使 d e g v ← d e g v + 1 deg_v\gets deg_v+1 degv←degv+1。二选一,考虑费用流。

注意到贡献是二次的,考虑将 d e g i deg_i degi 增加 1 1 1 的代价差分。差分数组是递增的,这满足了费用流的贪心性质,也就是说满流的边一定是差分数组的一个前缀。至此我们可以用左侧一排点表示未定向的边,右侧一排点表示原图点的 d e g deg deg 值,建图:

  • 连接源点和左侧点,容量为 1 1 1,费用为 0 0 0,表示这条边对 d e g deg deg 造成总量为 1 1 1 的贡献;
  • 连接表示边 ( u , v ) (u,v) (u,v) 的左侧点和表示点 u , v u,v u,v 的右侧点,容量为 1 1 1,费用为 0 0 0,表示 ( u , v ) (u,v) (u,v) 可以对两个点产生贡献;
  • 在每个右侧点和汇点之间连 n n n 条边,容量为 1 1 1,费用分别为 d e g deg deg 数组从 0 0 0 至 n − 1 n-1 n−1 的差分。

答案为 n ( n − 1 ) ( n − 2 ) 3 ! − m i n c o s t \frac{n(n-1)(n-2)}{3!}-mincost 3!n(n−1)(n−2)−mincost。

二分图匹配 & 偏序集

时间复杂度

匈牙利是 O ( n m ) O(nm) O(nm),Dinic 是 O ( n m ) O(\sqrt{n}m) O(n m)。

可行边与必须边

可行边 :在图上满流,或 S C C u = S C C v SCC_u=SCC_v SCCu=SCCv。
必须边 :在图上满流,且 S C C u ≠ S C C v SCC_u\neq SCC_v SCCu=SCCv。

注意这里的条件与最小割的区别。

证明

假设我们已经得到了一组解。如果这个图上存在某条长度为偶数的交错路,把这条路上的所有边状态取反不改变答案。因此属于一条长度为偶数的交错路的匹配边均是可行边,且不是必须边。这等价于在残量网络中 S C C u = S C C v SCC_u=SCC_v SCCu=SCCv。

而必须边即为排除掉上述情况的可行边。

Kőnig 定理

最小点覆盖:选最少的点,满足每条边至少有一个端点被选。

二分图中,最小点覆盖 = 最大匹配。

解的构造

显然我们只要找到一种构造方式就证明了这个定理,因此下文仅叙述如何构造出一组合法解。

我们先求出当前二分图的最大匹配,并记录匹配边。

接下来,从右侧的所有非匹配点遵循如下规则开始 dfs,并标记所有经过的点:

  • 右部点只能通过非匹配边向左走;
  • 左部点只能匹配边向右走。

我们取左侧被访问过的点和右侧未被访问过的点,它们的并集为一个合法解。

证明

首先,右侧的非匹配点一定都被 dfs 到了,加入答案的一定是匹配点。

而右侧被 dfs 到的匹配点一定是因为与之匹配的左侧点被 dfs 到了,那么这条边的左端点已经被选入了最小点覆盖。

左侧的非匹配点一定不会被 dfs 到,否则我们可以让走向它的右部点与之匹配,不满足二分图最大匹配的性质。

那么我们得出结论:只有匹配边的端点会被选上,且每条匹配边的端点恰好被选了一个。

接下来证明这组解覆盖了所有的边。

只有出现左部点未被 dfs 到且右部点被 dfs 到的情况,才会两个端点都不被覆盖。根据是否是匹配边分讨一下,发现这显然是不可能的。因此我们构造出的解合法,且总点数最小。

最大独立集

最大独立集:选最多的点,满足两两之间没有边相连。

二分图的最大独立集 = 总点数 - 最小点覆盖。

解的构造

二分图的最大独立集是最小点覆盖的补集。

可以根据定义证明:最小点覆盖是每条边只要一个端点被选,那么它的补集就是每条边至多有一个端点被选,即最大独立集。

最大团等于总点数减去补图的最大独立集。

[HAOI2017] 新型城市化

在补图上考虑问题。由于题目保证了原图可以划分为不超过两个团,这条性质等价于补图至少可以划分为两个独立集,进一步等价于补图是一个二分图。

我们的目标变成:在二分图上删一条边,判断最大独立集是否变大。

根据最大独立集的性质,我们判断的就是最大匹配是否减小,即判断哪些边是二分图最大匹配的必须边。可以利用上面的结论,先跑 dinic,再在残量网络上跑一遍 tarjan 求出答案。

偏序集

定义

偏序集:集合中部分元素可以比较大小。

全序集:集合中所有元素都可以比较大小。

链:全集的一个子集满足其是全序集。

反链:全集的一个子集满足所有元素都不可以比较大小。

链覆盖:若干的链的并集满足是全集,且两两之间没有交集。反链覆盖同理。

最长链:所有链中元素个数最多的集合,最长反链同理。

最小不可重链覆盖

因为不可重覆盖,可以将每个点拆为一个入点和一个出点。在两类点之间按照原图连边。

跑二分图最大匹配即可,答案为总点数减去最大匹配。

最小可重链覆盖

通常有三种办法(摘自 PPT):

  • 跑传递闭包后转为不可重覆盖,可重路径一定能在新图上对应一组不重路径。
  • 同样是拆点,设分别为 a i , b i a_i,b_i ai,bi,先连源汇点,然后 a i → b i a_i\to b_i ai→bi 下界为 1 1 1,原图的边连上 b j → a i b_j\to a_i bj→ai,所有边上界均
    为 inf ⁡ \inf inf,跑上下界最小流即可。
  • 还是拆点,考虑改造一下不可重复覆盖的二分图,先连源汇点,上界均为 1 1 1, b i → a i b_i\to a_i bi→ai 上界为 inf ⁡ \inf inf,原图的边
    a i → b j a_i\to b_j ai→bj 上界为 inf ⁡ \inf inf,这样就相当于在二分图上跑传递闭包了。

Dilworth 定理

一个偏序集中的最长反链大小,等于其中最小不可重链覆盖大小。

推论:一个 DAG 中最长反链的大小,等于其中最小可重链覆盖大小。

DAG 上最长反链的构造

模板:[CTSC2008] 祭祀

首先对 DAG 跑传递闭包,转为偏序集。拆点,转为二分图,并构造其最大独立集 I I I。

那么我们取出所有 x i n ∈ I x_{in}\in I xin∈I 且 x o u t ∈ I x_{out}\in I xout∈I 的点 x x x,它们构成原图的最长反链。

换句话讲:取出所有 x i n x_{in} xin 被 dfs 到,且 x o u t x_{out} xout 未被 dfs 到的点,这些点组成了 DAG 的最长反链。

证明略。

CF1630F Making It Bipartite

因为倍数关系有传递性,如果有边 a → b , b → c a\to b,b\to c a→b,b→c,则一定有边 a → c a\to c a→c。这样就会形成长度为 3 3 3 的奇环,不满足二分图的性质。

也就是说,图上的任意一个点不能既有入度又有出度,否则不合法。

考虑将一个点 x x x 拆成 x 0 x_0 x0 和 x 1 x_1 x1,分别表示 x x x 只有入度或只有出度。那么目标是找出若干对不能同时选的点,在它们之间连边,能够保留的点数即为这个图的最大独立集。

这个貌似不好直接求,但发现原图本身是一个偏序集,因此可以将我们自己建的图也定向成偏序集,求它的最长反链。

具体地, x 0 x_0 x0 和 x 1 x_1 x1 不能一起选,故连边 x 0 → x 1 x_0\to x_1 x0→x1;

如果 a y a_y ay 是 a x a_x ax 的倍数,除了 ( x 1 , y 0 ) (x_1,y_0) (x1,y0) 以外任意两点都不能一起选,连边 x 0 → y 0 , x 0 → y 1 , x 1 → y 1 x_0\to y_0,x_0\to y_1,x_1\to y_1 x0→y0,x0→y1,x1→y1。

上下界网络流

感觉没啥用。摆了。

相关推荐
Captain823Jack37 分钟前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
Captain823Jack1 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
是小胡嘛2 小时前
数据结构之旅:红黑树如何驱动 Set 和 Map
数据结构·算法
m0_748255022 小时前
前端常用算法集合
前端·算法
呆呆的猫2 小时前
【LeetCode】227、基本计算器 II
算法·leetcode·职场和发展
Tisfy2 小时前
LeetCode 1705.吃苹果的最大数目:贪心(优先队列) - 清晰题解
算法·leetcode·优先队列·贪心·
余额不足121383 小时前
C语言基础十六:枚举、c语言中文件的读写操作
linux·c语言·算法
火星机器人life5 小时前
基于ceres优化的3d激光雷达开源算法
算法·3d
虽千万人 吾往矣5 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划
arnold666 小时前
华为OD E卷(100分)34-转盘寿司
算法·华为od