网络流!

网络流好难啊!
整理一下网络流的常见模型。

网络流模型

网络流的模型很多很难想,但是如果知道建图方式后就会发现建图很显然。

最小割模型

我们已经知道了最大流是什么东西,那么最小割就是在这个图上删掉若干的边,使得不存在一条从源点到汇点的路径,并且删掉的边权值和最小。

做法就是直接对原图跑最大流即可,求出来的最大流就是最小割。

这还是比较显然的,因为只要是存在从源点到汇点的流量,就说明没割干净,如果把最大流全部割掉了,那么也就不存在从源点到汇点的流量了。

二分图最大匹配

如果一个图 G(V,E)G(V,E) 不存在奇环,那么我们称这种图为二分图(二部图)。
二分图的一个显著特征就是可以将 VV 分成两个不相交的集合 V1,V2V_1, V_2 使得 V1V2=VV_1 \cup V_2 = V,并且同一个集合的两个点之间不存在连边。

网络流!
这就是一个二分图。

构造二分图的一个常用方法是将原图进行黑白染色,黑色点在一边,白色点在另一边。

如果对于每一个点,有一个连边的最大限制数,我们需要在满足限制的情况下选出最多的边,这样的问题称为二分图的最大匹配问题。

我们假设对于点 xx,限制最多有 t[x]t[x] 条边,那么我们在左边建一个源点连向左边的点,流量限制为 t[x]t[x],右边的点连向汇点,流量限制为 t[x]t[x],对于原图的边,流量限制为 11,求出来的最大流就是最大匹配数。

二分图的最小点覆盖

一个图的最小点覆盖是指在图中选择数量最少的点,使得这些点能覆盖到所有的边,即对于一个图 G(V,E)G(V, E),选择一个点集 VVV' \subseteq V 使得对于每条边,至少一个和他相邻的点在集合 VV' 中且最小化 V|V'|

不难发现二分图的最小点覆盖等于其最大匹配。

二分图的最大独立集

一个图的最大独立集是指在图中选择尽量多的点,使得任意两个点之间没有连边,即对于一个图 G(V,E)G(V, E),选择一个点集 VVV' \subseteq V 使对于任意两个点 x,yVx,y \in V',都有 (x,y)E(x, y) \notin E 且最大化 V|V'|

二分图的最大独立集等于所有顶点数减去其最小点覆盖。

二分图的最大团

如果一个图的某个子图是一个完全图,那么我们称这个子图是原图的一个团,顶点数量最多的团就是最大团。

一个图的最大团问题可以转化为其补图的最大独立集问题,如果这个图是二分图,跑网络流解决即可。

两个集合!

我们常常会遇到这样一个模型,即我们需要将一堆元素分配到两个集合里,元素间有一些限制,每个元素进入某个集合都会有一个代价,求在满足限制的情况下的最小代价。

最大收益的话也可以先把所有的收益相加,转化为最小代价。

这个时候我们一般只需要将每个点拆成两个,建立二分图,求最小割即可。

首先对于第 ii 个点拆成两个点 xi,yix_i, y_i,这两个点之间连接一条流量为 \infty 的边,然后源点向每个 xix_i 连边,表示点 ii 在集合 AA 中,$每个 yiy_i 向汇点连边,表示点 ii 在集合 BB 中。

显然一个点不能同时在集合 AA 中和集合 BB 中,那么就必须割掉从源点连接到 xix_i 的边或者割掉从 yiy_i 连向汇点的边,那么对应的边设置为相应的代价即可。

这里要注意的是如果割掉了源点与 xix_i 相连的边,说明点 ii 最终进入了汇点的集合里,那么需要支付的是进入汇点集合的代价。

限制根据情况在两点之间连接额外的边即可。

比如限制 xx 进入 AAyy 就不能进入 BB,那么从左边的 xx 点向右边的 yy 点连边,流量限制为 \infty 即可。

好像也只适用于这种限制了。

最大权闭合子图

如果一个子图满足对于这个子图中的任意一个点 xx,所有 xx 在原图中能到达的点也在这个子图的点集中,那么这个子图我们称作闭合子图。

对于每一个点有一个权值,求权值和最大的闭合子图问题我们称作最大权闭合子图问题。

对于这个问题,我们只需要先把所有的正点权相加,然后对于所有点权为正的边连接一条从源点过来的边,流量限制为其点权,对于所有点权为负的点连接一条通向汇点的边,流量限制为其点权绝对值,原图上的边流量限制为 \infty,那么所有正点权之和减掉这个图的最小割就是最大权。

或者说我们创建两个集合分别代表选择的点和没选择的点,转化为两个集合的问题。

常用于代表偏序关系的图。

DAG上的最小路径覆盖

在一个有向无环图上找到若干条简单路径(路径中不包含重复的点),使得每个点属于且只属于一条路径,且路径数最小。

首先将答案设置为 nn,即所有的点单独成一条路径,然后考虑对路径进行合并。

将每个点拆成两个点 xi,yix_i, y_i,表示出点和入点,即每个点在 xx 出去,进入到 yy,然后根据原图连边,跑最大匹配即可,源点通向的边和通向汇点的边边权都为 11,因为对于一条路径上的点,只允许从一个点进入从另一个点出去。

跑出来的每个匹配代表了一次合并操作,最后用总点数减去最大匹配数即最小路径覆盖数。

有上下限的网络流

很多时候我们处理问题时对于网络流中的某条边的流量限制有一个下界,即必须有这些流量流经这条边,对于这种情况,有一个非常巧妙的处理方法,

如果点 xx 必须支付 tt 点流量给点 yy,那么我们不妨让这 tt 点流量经过汇点,然后从源点流到点 yy,也就是说连接一条从 xx 到汇点的边,流量为 tt,连接一条从源点到 yy 的边,流量也为 tt,这样的话为了满足最大流的限制,xx 一定会尽可能支付 tt 点流量,而 yy 一定会收到 tt 点流量。

如果 xx 无法支付 tt 点流量给汇点,那么就说明这个图无法满足这个下界。

剩下的 tt 点之外的流量直接从 xx 连接到 yy 即可。

费用流模型

费用流固定的模型比较少,大多数还是根据网络流模型添加一些费用,或者是根据最短路添加一些限制。

有递增费用的费用流

多建几条边即可。

比如第一次费用为 a1a_1,第二次费用为 a2a_2,那么建立一条费用为 a1a_1 的边,之后再建立一条费用为 a2a_2 的边即可,一定会先走小的再走大的的。