网络流建图trick
网络流建图trick
请确保你会熟练背诵 dinic 或 ISAP 等最大流和费用流的算法,并且大致明白网络流的定义。
网络流作为算法竞赛的一个套路性的知识点,没有感情全是技巧。
网络流需要用自己理解的方式进行建图,用自己总结的方法构建同一的模型。
网络流统一于最大流、最小割 、费用流三个部分,根据前人总结的一些模型,我们可以略窥网络流世界的一二。
P.S.本文没有较为详细的证明,通过相对易于理解和形象化的语言描述网络,总的来说,就是一些建图的 trick 。
最大流
我们可以使用网络流算法求出一个网络从 S 到 T 的最大流。
设一条边 \(<x,y>\) 的流量为 \(f(x,y)\)。
通常我们有三个网络的基本性质(网络流的定义):
-
在一个网络中,从
S流出的流量等于流入T的流量,即 \(\sum_{x\in out(s)}f(s,x)=\sum_{x\in in(x)}f(x,t)\) 。 -
节点不存储流量,从 \(x\) 流入的流量等于从 \(x\) 流出的流量,即 \(\sum_{y\in in(x)}f(y,x)=\sum_{y\in out(x)}f(x,y)\) 。
-
一条边的反边的流量是它的相反数,即 \(f(x,y)=-f(y,x)\) 。
这三条性质可以描述一个网络,也是一些题目的关键切入点。
Trick:最大流的题目同常要求我们最大好某个决策或情况,这个东西通常能被一个抽象成一个网络,其中流量就是决策或题目要求我们做的情况,然后跑最大流即可。
最大流模型 —— 二分图最大匹配
如果我们要找到一个二分图的最大匹配,除了匈牙利算法以外,我们还有时间复杂度更优秀的网络流解法。
最大匹配:在二分图中选出一个最大的边集,边集中的所有点都不相同。
由于每个点都最多只会选一次,所以点集是我们的切入点。
我们把流量当做贡献,每个点只会产生 1 的贡献,要么有其中一条边与它相连,要么没有。
我们将左部的点与 S 相连,右部的点与 T 相连,容量都为 1,这样就满足了每个点最多产生 1 的贡献的性质。
我们发现,只要满足这个性质的边集一定是一组匹配,所以我们将所有的边都加进来,容量为 1,这个网络的可行流对应了一组匹配,我们求最大流就得到了原问题的解。
ex二分图最大匹配:
Q:如果每个点可以被 \(K\) 条边覆盖怎么做?
A:将每个点流向源/汇点的容量设为 \(K\) 就行了。
Q:如果边集带权怎么做?
A:我们扩展到最大费用流,在所有的最大流中选择一种费用最大的方式,这与原问题等价。具体来说,对于边集中的边,费用为这条边的边权,其他与源/汇点相连的边的费用都为 0。
Trick:在一些最大流的题目中,一个网络的可行流与原问题的一种情况双射(一一对应),我们用最大流求解最大流量的过程中就是在求解原问题的最大值。
上下界可行流/最大流/最小流
一般的最大流只有上界,可以直接用最大流算法求解。
如果一张图有上下界,我们新加一种流量,用来维护原来的流量。
具体来说,我们新建一个源点一个汇点(区别于原网络中的源点与汇点),对于原网络中的一条边,设流量的取值范围为\([L,R]\)。
对于新的网络,我们用新网络的流量维护旧的流量,这看起来有点抽象。具体来说,我们对于一条边 \(<x,y>\) ,原来的流量取值是 \([L,R]\),我们将原网络的流量变成我们熟悉的只有最大限制的最大流,将原网络的这条边权设为 \(R-L\) ,然后再对原网络进行流量补偿,让新网络等价原网络。
我们按照最大流的三个基本性质进行思考:
我们手动模拟一下流量经过一条边 \(<x,y>\) 的过程:
当我们想进入 \(x\) 时,我们要求流量 \(\ge L\) ,并且我们已将新网络的流量限制变为 \([0,R-L]\) ,所以我们想把大小为 \(L\) 的流量“扔掉”,相当于连上从 x 到 T 流量为 \(L\) 的边。
当我们从 \(y\) 出去的时候,我们已经丢掉了 \(L\) 的流量,所以我们要重新“获得”他们,相当于原连上从 S 到 x 流量为 \(L\) 的边。这样就完成了流量补偿。
如果原网络有源汇点,那么在新网络源汇点不满足这个性质,但是我们可以新建一条边,从 T 流到 S 流量为 \(+\infin\) 。
我们发现,我们把原网络中的源点和汇点删去了,变成了一般网络,新网络也变得合法了。
显然,经过这样的操作过后,其他的两条性质也满足了要求。
所以我们对新网络跑最大流,在判断这个新网络的流量是否等于我们新加进去的流量,就能判断它是否有解。(新加入的边权是否流满)
如果题目要求输出每条边的流量,那么我们只需输出原网络所对应的流量加上下界即可。
我们发现这样原网络不一定保证是最大流/最小流,所以我们要进行一下操作:
我们发现,如果我们去掉新加的边,对于原网络而言,当前的网络只是一个可行流,这表示这是一个残留网络,我们仍然能在这张图上找到增广路。
所以如果我们在原图上继续增广,我们就能得到最大流/最小流。
具体来说,就是去掉所有新加的边,最大流从原网络的 S 到 T 再跑一边 dinic,最小流从原网络的 T 到 S 再跑一边 dinic。
最小割
最小割的定义是:将一些边割断,让网络的最大流量为 0 。
有一个构造方案是:对于一个原网络的最大流,我们对于一条增广路,将路上任意一条流满的边删掉,删去的边就是原网络的最小割的一个合法方案。
我们发现,这样构造的方案最小割在数值上等于最大流。
反证法:
我们将边都删去了以后,发现原来的的流量全被我们断掉了。因为一条满流的边只会被断一次,一条满流的边不能被两条增广路同时增广。
对于剩下的边,如果原图还能联通,那么就相当找到一增广路。那么原图的最大流量就还能更大。
这与最大流的最大性相悖,所以原命题成立。
所以有最小割定理:最小割等于最大流。所以我们对原网络求解最大流,就找到了原网络的最小割。
如果题目要求输出最大方案,那么满流的边就是我们要找的最大方案。
最大权闭合子图
先介绍闭合子图的概念,如果一个点在这个集合中,那么这个点能到达的所有点都在这个点集合当中。
所以就是:对于 \(\forall x\in S\),那么 \(\forall y\in son(x)\) ,有 \(y\in S\) 。
一个最大权闭合子图问题就是给你一张图,点有点权,选择最大权值最大的一个闭合子图。
这有个通用的建图方式:对于原图上的每条边,都将边权设为 \(+\infin\) ,对于每个权值为正的点,连上 \(<s,x,w(x)>\) ,对于每个权值为负的点,连上 \(<x,t,-w(x)>\) 。
这张图上的最大权闭合子图就等于正权值之和减去新网络上的最小割。
证明略过。(太菜了不会证 qwq )
Trick:最小割的题目通常是让我们选取某种东西,并让它最小,其中选取等价于”割断“,可以将它转化为最大权闭合子图问题。流量相当于贡献,通常贡献有正有负,而边权不能为负,我们可以将正边权连向 S ,负边权连向 T ,边权为贡献的相反数,最后用所有正权值之和减去最小割得到答案。
平面图最小割 = 对偶图最短路

浙公网安备 33010602011771号