网络流的常见建模

这是个大工程,以后会不断补充。

最大流

最大流的建模,往往是把流量和题目要求的东西直接关联起来,是最简单直白的建模。最大流的模型有时候可以转化为二分图最大匹配

拆点模型

P2472 [SCOI2007] 蜥蜴

网络流图中的点如果有流量限制,那么可以把一个点 uu 拆成入点 u1u_1 和出点 u2u_2u1u_1 负责接收流量,u2u_2 负责输送流量,u1u1u2u2 连一条流量为点权的边即可。

分层图模型

P2754 [CTSC1999]家园 / 星际转移问题

网络流图中的点如果会“动”,那么不妨按时间分层建图,模拟时间流逝。

还有一类题比较特殊,要求最小层数。那么先判断无解,再不断加层直到满足条件即可。

最小路径覆盖模型

P2764 最小路径覆盖问题

正难则反,首先考虑让所有点都自成路径,然后考虑尽可能通过边来“合并”这些路径。

因为每个点只能在一条路径上,所以考虑拆点。把每个点 uu 拆成 u1u_1u2u_2,源点向 U1U_1 连一条流量为 11 的边,u2u_2 向汇点连一条流量为 11 的边,表示 uu 在路径上的前驱和后继只能有 11 个节点。

然后对于每条边 (x,y)(x,y),从 x1x_1y2y_2 连一条边,表示 yy 可以做 xx 的后继,xx 可以做 yy 前驱。

最后用 nn 减去最大流即可。

可以发现此时的图其实是一个二分图,所以可以用二分图最大匹配代替网络流。

流量平衡模型

网络流求最小费用特解(网络流解线性规划)学习笔记

危桥模型

P3163 [CQOI2014]危桥

往返 ana_n 次相当于是从 a1a_1a2a_2 走了 2an2a_n 次,bb 也一样,所以问题转化为:

有两组源汇点 s1,t1s1,t1s2,t2s2,t2s1t1s1\to t1 最多流 a1a1 的流量,s2t2s2\to t2 最多流 a2a2 的流量,请判断能否满流。

若直接源点向 s1,s1s1,s1 分别连流量为 a1,a2a1,a2 的边,t1,t2t1,t2 向汇点连流量为 a1,a2a1,a2 的边然后判是否满流,可能会出现这种情况:

所有满流的方案中都会有一部分流量从 s1s1 流到 t2t2,一部分流量从 s2s2 流到 t1t1,此时实际上是不存在合法方案的,但是这样建图却会认为可以满流。

解决方案很简单,我们交换 s2,t2s2,t2,即从源点向 t2t2 连流量为 a2a2 的边,从 s2s2 向汇点连流量为 a2a2 的边,其余部分连边不变,再判断一次是否满流。若上图中的不合法情况必然出现,那么新图不可能满流;否则若新图上这种情况必定出现:

那么原图必定不可能满流。因为假若这两种情况同时出现,那么就可以这样流:

所以只要这两个图都能满流就证明原问题有解。

类似的,这种建模方法应该还能推广到有 nn 对源汇点的情况,通过固定一对源汇点,枚举剩下的源汇点的交换与否,跑 2n12^{n-1} 次最大流,则原问题有解当且仅当每次都是满流。

最小割

从最小割角度建模也是一种比较常见的建模方式。

设点 uu 最终在源点 SS 所在的连通块则 bu=1b_u=1,否则 bu=0b_u=0

基本模型

考虑最小割的数学定义:

  • (S,x,a)(S,x,a) 对答案的贡献为 a×(1bx)a\times (1-b_x)
  • (x,T,a)(x,T,a) 对答案的贡献为 a×bxa\times b_x
  • (x,y,a)(x,y,a) 对答案的贡献为 a×bx(1by)a\times b_x(1-b_y)

所以基本限制如下:

nn 个 01 变量 bib_i,你需要确定每个 bib_i 的取值使得代价最小。

代价分为三类:

  • bi=0b_i=0,有代价 w1iw1_i
  • bi=1b_i=1,有代价 w2iw2_i
  • bi=1b_i=1bj=0b_j=0,有代价 w3i,jw3_{i,j}

基本模型如下:

给第 ii 个元素建一个点 ii

  • 对于第一类限制,连边 (S,i,w1i)(S,i,w1_i)
  • 对于第二类限制,连边 (i,T,w2i)(i,T,w2_i)
  • 对于第三类限制,连边 (i,j,w3i,j)(i,j,w3_{i,j})

混合模型

相当于把基本模型中的 SS 换成别的点,流量不再由 SS 直接提供。

可以看成多层基本模型。

共同收益模型

P1361 小M的作物

诸如「对于所有 uAu\in A,若 bu=A\sum b_u\not=|A| 则有代价 ww」的情况,可以新建一个点 uu,连接边:

  • (S,u,w)(S,u,w)
  • (u,x,inf)(u,x,\inf),其中 xAx\in A

同理,「对于所有 uAu\in A,若 bu=0\sum b_u\not=0 则有代价 ww」的情况也可以类似做,新建一个点 uu,连接边:

  • (u,T,w)(u,T,w)
  • (x,u,inf)(x,u,\inf),其中 xAx\in A

建图是这样的:

切糕模型

P3227 [HNOI2013] 切糕

nn 个整数变量 bib_i,第 ii 个变量取值范围 [Li,Ri][L_i,R_i]

代价分为两类:

  • bi=xb_i=x 时有代价 Wi,xW_{i,x}
  • bix,bjyb_i\ge x,b_j\ge y 时有代价 Wi,x,j,yW_{i,x,j,y}

直接看图吧:

混合模型

各种模型的流量都可以不由 SS 直接提供。

P8215 [THUPC2022 初赛] 分组作业 | 题解