这是个大工程,以后会不断补充。
最大流
最大流的建模,往往是把流量和题目要求的东西直接关联起来,是最简单直白的建模。最大流的模型有时候可以转化为二分图最大匹配。
拆点模型
网络流图中的点如果有流量限制,那么可以把一个点 拆成入点 和出点 , 负责接收流量, 负责输送流量, 向 连一条流量为点权的边即可。
分层图模型
网络流图中的点如果会“动”,那么不妨按时间分层建图,模拟时间流逝。
还有一类题比较特殊,要求最小层数。那么先判断无解,再不断加层直到满足条件即可。
最小路径覆盖模型
正难则反,首先考虑让所有点都自成路径,然后考虑尽可能通过边来“合并”这些路径。
因为每个点只能在一条路径上,所以考虑拆点。把每个点 拆成 和 ,源点向 连一条流量为 的边, 向汇点连一条流量为 的边,表示 在路径上的前驱和后继只能有 个节点。
然后对于每条边 ,从 向 连一条边,表示 可以做 的后继, 可以做 前驱。
最后用 减去最大流即可。
可以发现此时的图其实是一个二分图,所以可以用二分图最大匹配代替网络流。
流量平衡模型
危桥模型
往返 次相当于是从 到 走了 次, 也一样,所以问题转化为:
有两组源汇点 和 , 最多流 的流量, 最多流 的流量,请判断能否满流。
若直接源点向 分别连流量为 的边, 向汇点连流量为 的边然后判是否满流,可能会出现这种情况:

即所有满流的方案中都会有一部分流量从 流到 ,一部分流量从 流到 ,此时实际上是不存在合法方案的,但是这样建图却会认为可以满流。
解决方案很简单,我们交换 ,即从源点向 连流量为 的边,从 向汇点连流量为 的边,其余部分连边不变,再判断一次是否满流。若上图中的不合法情况必然出现,那么新图不可能满流;否则若新图上这种情况必定出现:

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

所以只要这两个图都能满流就证明原问题有解。
类似的,这种建模方法应该还能推广到有 对源汇点的情况,通过固定一对源汇点,枚举剩下的源汇点的交换与否,跑 次最大流,则原问题有解当且仅当每次都是满流。
最小割
从最小割角度建模也是一种比较常见的建模方式。
设点 最终在源点 所在的连通块则 ,否则 。
基本模型
考虑最小割的数学定义:
- 边 对答案的贡献为 ;
- 边 对答案的贡献为 ;
- 边 对答案的贡献为 ;
所以基本限制如下:
有 个 01 变量 ,你需要确定每个 的取值使得代价最小。
代价分为三类:
- 若 ,有代价 ;
- 若 ,有代价 ;
- 若 且 ,有代价 ;
基本模型如下:
给第 个元素建一个点 。
- 对于第一类限制,连边 ;
- 对于第二类限制,连边 ;
- 对于第三类限制,连边 ;
混合模型
相当于把基本模型中的 换成别的点,流量不再由 直接提供。
可以看成多层基本模型。
共同收益模型
诸如「对于所有 ,若 则有代价 」的情况,可以新建一个点 ,连接边:
- ;
- ,其中 ;
同理,「对于所有 ,若 则有代价 」的情况也可以类似做,新建一个点 ,连接边:
- ;
- ,其中 ;
建图是这样的:

切糕模型
有 个整数变量 ,第 个变量取值范围 。
代价分为两类:
- 时有代价 ;
- 时有代价 ;
直接看图吧:

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