网络流
网络流专题
这是笔记和习题。(还没写完)
上下界网络流
可行流
首先不同于普通网络流模型,这个不一定有解。
所以最基本的问题就是可行流问题。
考虑建立超级源点 ss 和超级汇点 tt。对于原图上一条边 \((u,v,l,r,c)\),我们将其改为三条边:\((ss,v,0,l,c)(u,v,0,r-l,c)(u,tt,0,l,0)\)。
相当于 \(u\) 直接流走 \(l\) 的下界,\(v\) 直接流入 \(l\) 的下界,价格规约到 \((ss,v)\) 计算(当然规约到另一边也一样)。
为了流量平衡,从 t 向 s 连 \((t,s,0,+\infty,0)\)。
这样,我们考虑若是 ss 到 tt 的最大流是满流,证明这是一个可行流。
通过残量网络不难得出原图的一个可行流。
最大流/最小流
直接搬。
对于新图求ss到tt的最大流tmp1,然后删除ss和tt以及t到s的边,然后求s到t的最大流tmp2,最大流即为tmp1+tmp2.
不连t到s的边,对新图做ss到tt的最大流,然后添加t到s的边,对新图做ss到tt的最大流,这时t到s的边的流量即为最小流。
其实我还有点问题,但是等到写完再去问。
什么?例题?这个到时候再说吧。
最小流例题:随便找一道什么最小路径覆盖的题目建个上下界网络流的图就好啦。
最小割
第一类是裸的最小割问题。
WerKeyTom_FTD 老师给了一个例题:
给一张图,求要删去多少条边才能使给定边既在最小生成树上又在最大生成树上
展开题解
考虑 K 算法(没错,我无法记下全名)的过程。对于边 \((u,v,k)\),我们将 \(<k\) 的边全部尝试加入后,如果 \(u,v\) 不联通就是可行的。最大生成树同理。
我们发现最小生成树和最大生成树其实是独立的(一个只需要 \(<k\),一个只需要 \(>k\)),可以分开做。
那就是给定一些边,删去最少的边使得 \(u,v\) 不联通。将每条边权值视为 \(1\) 就是裸的最小割了。
第二类是把对象分两类。
主要是利用最小割实质上是把所有点划分到 \(S\) 和 \(T\) 两个集合的性质。
大概是这样一个流程:
-
考察原模型上的传递关系,从这里反推出 \(i \in S\) 和 \(i \in T\) 的定义(分类讨论正负权、不同类点)。
-
建图求解最小割
一般来说有正负权求最大值就是权值全部加起来,然后求最小负权和正权撤销。
然后剩下的都是例题了。
-1 OI-WIKI 问题 1
关系是“如果 \(u_i\) 和 \(v_i\) 不在同一个集合会花费 \(w_i\)”。
于是定义点 \(i \in S\) 属于 \(A\) 集合,点 \(i \in T\) 属于 \(B\) 集合。
连边 \((s,i,a_i)\),割了这条边就有 \(i \in T\),付出代价 \(a_i\)。
同理 \((i,t,b_i)\)。
考虑连接 \((u_i,v_i,w_i)(v_i,u_i,w_i)\) 割去此边则分属不同集合。
\((i,j,k)\) 的含义是若 \(i \in S,j \in T\) 就付出 \(k\) 的代价。特别的,\((i,j,+\infty)\) 表示 \(i \in S \Rightarrow j \in S\)。
0 OI-WIKI 问题 2
关系是“如果 \(u_i\) 选 \(v_i\) 也要选”。显然是 \(S \Rightarrow S\) 关系。
发现有正负权,先加上所有正权,改成求最小负权和正权撤销。
定义点 \(i \in S\) 表示选 \(i\)。
对于正权点,不选付出 \(a_i\) 代价,连 \((s,i,a_i)\)。
负权点选付出 \(-a_i\) 代价,连 \((i,t,-a_i)\)。
关系就 \((u_i,v_i,+\infty)\)。
1 CF786E ALT
关系是“一个公民只有在他自己有一只小狗,或者沿途所有守护者都有一只小狗(他在每条道路上都看到守护者的小狗并感到快乐)时才会感到快乐”。
也就是公民没小狗则沿途所有守护者都有一只小狗。
我们可以定义公民 \(i \in S\) 表示没有小狗,守护者 \(j \in S\) 表示有小狗。
则 \((i,j,+\infty)(s,i,1)(j,t,1)\)。
(这是二分图模型,跑最大流是 \(O(m\sqrt{n})\))
建图考虑各种方法都行,我用了倍增优化建图,那么一个点的边数就是 \(O(n\log{n})\),总共 \(O(n\sqrt{n}\log{n})\)。
最小割方案构造
根据定义,其实就是沿着非满流边跑到的点就是 \(i \in S\)。
2 LGP5996 Muzeum
关系类似是“选手办 \(i\) 就要贿赂警卫 \(j\)”。
首先仍然是正负权,把所有手办价值加起来,统计最小代价加放弃。
定义手办 \(i \in S\) 表示选手办 \(i\),警卫 \(j \in S\) 表示贿赂警卫 \(j\)。
建图就是 \((s,i,a_i)(j,t,a_j)(i,j,+\infty)\)。
然后考虑 \((i,j,+\infty)\) 怎么建。
考虑警卫 \(j\) 可以看到手办 \(i\) 当且仅当 \(\frac{|\Delta_x|}{|\Delta_y|} \leq \frac{w}{h},y_j \geq y_i\)。
换系:
(注意到若 \(y_j < y_i\),上面的变号就不正确,导致式子不成立)。
(为啥改成 \(\leq\),因为可以 lower_bound)。
直接令 \((x'_j,y'_j)=(wy_j+hx_j,hx_j-wy_j)\),条件就是 \(x'_j \geq x'_i,y'_j \leq y'_i\)。
但是这题的范围明显跑不了网络流。
考虑模拟最大流。先假设 \((s,i,a_i)\) 全流满了,流量停在所有的手办 \(i\)。
扫描线倒着扫 \(x'\),记录沿途的可能流量(手办点),每次到达一个警卫就贪心的从还有流量且 \(y'\) 最小(且比当前大)的点流过来。由于 \(y'\) 大的点作用不小于 \(y'\) 小的点,贪心是正确的。
参考资料
这个主要是用了里面两个例题。
-
WerKeyTom_FTD 老师的讲课以及作业
参考了最小割方案的构造。

浙公网安备 33010602011771号