最小割
概述
-
最小割在实质上是一种很...精妙的模型,与状压中的依赖式问题一样,都在一定程度上反映着决策之间的矛盾。
-
每一条从 \(S\) 到 \(T\) 的路径,其上的边都满足某种矛盾关系,必有一条边删掉。
-
根据对应边是实际边(即希望参与删除的)还是结构边(即为构成路径而添加的虚边或不许删的边,不希望参与删除),可以控制容量来调整删谁。
最大流最小割定理
-
对任意网络,其最大流流量等于其最小割容量。
-
证明:
-
首先,容易证明 \(\min c(S,T)\geqslant \max f(S,T)\)。
-
不妨假设 \(\exists c(S,T)<\max f(S,T)\),于是将 \(c\) 中所有边(注意网络上其实只有正边,反边是我们为了退流构造的虚边)都从网络上删去。
-
显然这最多使 \(f(S,T)\) 减少 \(c(S,T)\),于是 \(f'>0\),故 \(S,T\) 仍然连通(有增广路),与前设不符。
-
-
下面给出构造证明总有 \(\min c(S,T)=\max f(S,T)\)。
-
在一个已经跑完最大流的残量网络上,我们从 \(S\) 出发进行 bfs(相当于做一遍 EK 来推流,这里只使用有容量的边),标记所有能到达的点。
-
对于所有满流边(这里不存在反边这种东西!但 bfs 的时候是会用有容量的反边的),如果其起点被标记而终点未被标记,则该边在我们的最小割中,否则不在。
-
注意,这不等价于取每条有流量的路径上的最左满流边边为割边(认为 \(S\) 在左边)!可能会绕后。
-
合法性:
-
容量为 \(0\) 的边集一定是合法割的超集。
-
使用反证法。假设它们不足以构成一个割,则还存在其他路径。
-
既然满流边都容量为 \(0\) 也即相当于 ban 掉了,则对应路径上每条边都不满流,于是该路径为增广路,不符合已求出最大流的前设。
-
-
然后,所有取到的边其实足以堵住所有流。
-
若某条满流边的 \(s\) 就没有被标记,说明更靠前(这个更靠前指的是,唔,大概是分层图意义上的)的满流边已经把它的来源堵住了,换言之它堵在这里是架不到人的。
-
于是取出的边集足够作为一个割。
-
-
-
最优性:
-
考虑递归这个问题,每次随意选一条我们认为在最小割中的边,将它在图上删去,最大流流量一定减小 \(f(s,t)\),且其他我们选中的边的 \(f(s,t)\) 不变。
-
前者显然,后者不妨反证法:
-
首先注意到每条有流量路径上有且仅有一条边在最小割内,如果无则有流量,如果 \(>1\) 则删去更小。
-
对于一条有流量路径,其一定是前缀被标记。不妨假设其不是前缀被标记,由其有流量可知每条边的反边都有容量,于是较后的标记点会把较前的未标记点标记,矛盾,故一定是前缀被标记。
-
如果某条边的 \(f(s,t)\) 变化,则说明其一定和删去边共有流量路径;而上面的只标记前缀告诉我们,这条路径上的标记-无标记边一定只有一条,换言之只会有一条在我们认为的最小割中,矛盾,故 \(f(s,t)\) 一定不变。
-
那么这样删下来,得到的恰为选中边的 \(\sum f\),又它们都是满流边且 \(f\) 不变,故 \(\sum f=\sum c\),又由割的定义,我们这样一条一条删一定有 \(\sum f=f(S,T)\)(\(f\) 是那条边被删去时它的流量),于是 \(\sum c=f(S,T)\),原命题得证。
-
-
另外,由于 Dinic 中我们会 bfs 判增广路存在性,不存在则返回最大流量,所以其实这个 bfs 做过了,直接用 Dinic 的 bfs 的结果就好。
-
-
注意:“最小割在数值上与最大流相等,但在本身性质上与最大流无任何关系。”不要落入最大流的窠臼!
例题
P1345 [USACO5.4] 奶牛的电信 Telecowmunication}
-
题意:
-
给定一张 \(n\) 点 \(m\) 边的无向图。
-
定义“删去一个点”为将一个点及与其相连的所有边删去。
-
问令 \(s,t\) 不连通至少要删去多少个点。
-
-
数据范围:\(n\leqslant 100,m\leqslant 600\)。
-
这是一道非常棒的最小割入门题。
-
我们看到,正常的网络是要删边,这里却是要删点。局面顿时复杂不少。
-
我会拆点!把无向边拆成有向边,把每个点拆成 \(in_v,out_v\),\(in_v\) 接受所有入边,然后连一条出边到 \(out_v\),\(out_v\) 发出所有出边。
-
不错。可是我们要怎么做才能确保一定不会删到 \(in_v\to out_v\) 以外的其他正常边?
-
这就到流量发威的时候了。令原有边的容量为 \(inf\),虚边的容量为 \(1\)。问题解决。
-
最后边数大概在 \(2m+n\),总复杂度还是 \(O(n^2m)\)。
P1361 小M的作物
-
题意:
-
有 \(n\) 种作物,第 \(i\) 种种在田地 \(A\) 中收益 \(a_i\),种在 \(B\) 中收益 \(b_i\)。
-
另有 \(m\) 种组合,如果第 \(i\) 个组合中的作物共同种在 \(A\) 或 \(B\),则有 \(c_{a,i}\) 或 \(c_{b,i}\) 的额外收益。
-
求最大总收益。
-
-
数据范围:\(n\leqslant 10^3,m\leqslant 10^3\)。
-
首先很容易想到把每个作物开一个点,把 \(A\) 作为 \(S\),\(B\) 作为 \(T\),自 \(A\) 向每个作物连容量为 \(a_i\) 的边,自每个作物向 \(B\) 连容量为 \(b_i\) 的边。
-
可是,组合怎么办?考虑先对每个组合建一个点,然后和上面一样地连边,毕竟互相矛盾。
-
接下来,\(A\) 一侧的组合和所有组合中作物连向 \(B\) 的边矛盾...所以从组合点向所有作物连容量为 \(inf\) 的边。
-
于是构成了 \(A\to \text{组合}\to \text{很多作物}\to B\) 的路径,要么放弃 \(A\to \text{组合}\) 的容量,要么放弃 \(\text{很多作物}\to B\) 容量。
-
可是难道...也从所有作物向组合连边?不对。得把组合开两个虚点,分别处理。
-
解释一下原因,毕竟我在这里挂了一次:
-
这样做就会出现 \(inf\) 权环,考虑 \(S\to 1,2,\to T\),\(1,2 \to 4,4\to 1,2\) 的情况,其中 \(4\) 为组合的虚点。
-
于是此时存在一条路径 \(S\to 1\to 4\to 2\to T\),\(S\to 1\) 和 \(2\to T\) 矛盾了,和我们的需求不符。
-
-
这里因为网络流要建反边所以会有重边,但是网络流重边不敏感。
-
于是 \(\sum v-\sum\limits_{e\in E'}c(e)\) 即为答案。
-
谈一下复杂度:建完图之后点数上界 \(3\times 10^3+2\),边数上界 \(2\times 10^6+4\times 10^3\),乍一看网络流复杂度是一定炸掉的。
-
但是这里图只有两层,Dinic 几乎没有外层复杂度。虽然内层的 \(O(nm)\) 也趋于 \(4\times 10^9\),看起来毫无希望,但事实上边数那么多的话图就极其稠密,已经趋于 \(n^2\) 了。
-
那么显然我们可以期望 Dinic 发挥出它强大的 \(\Omega(m)\sim O(nm)\) 的力量,横竖没有 \(\Theta\) 就算成功!
P1344 [USACO4.4] 追查坏牛奶 Pollutant Control
-
题意略。
-
第一问无疑是个最小割板子,第二问怎么办?
-
某,有一奇技淫巧:把每条边的容量 \(+eps\),这里 \(eps<\dfrac{1}{m}\)。
-
于是求出的最小割的整数部分应该不变,小数部分事实上反映了割了几条,且会尽量少割。最大流那边只是数值相等,不用关心图论意义。
-
唔...事实上,是可行的。而且建议乘一个足够大的数转到整型范围。
P2057 [SHOI2007] 善意的投票 / [JLOI2010] 冠军调查
-
题意略。
-
首先容易看出是最小割。
-
本题的建模比较有趣,我们详细谈谈:
-
\(S\) 代表睡觉。从 \(S\) 向所有想睡觉的小朋友连边。
-
\(T\) 代表不睡觉。从所有不想睡觉的小朋友向 \(T\) 连边。
-
对于每一对朋友....朋友怎么连边?
-
-
不妨先处理分居左右(认为 \(S\) 在左)的朋友对 \((x,y)\)。显然应该只需要从左向右连边(从右向左连的边,最大流中就应当是没用的,最小割下也没有实际意义),考察其实际意义:
-
割 \(S\to x\) 的边:\(x\) 改主意了,不睡觉。但是要付出他违背自己意愿的代价。
-
割 \(x\to y\) 的边:硬吃这一对朋友选择不同的代价。
-
割 \(y\to T\) 的边:\(y\) 改主意了。
-
-
那问题来了。同一边的朋友怎么办?不用连边?
-
不行,残量网络是一个动态的东西。考虑 \((x,y)\) 都在左边的情况,可能割了某条 \(S\to x\) 之后 \(x\) 等效在右边,于是此时 \(S\to y\to x\to ?\to T\) 构成矛盾。
-
所以这不是二分图,同部点之间有边。必须连双向边。当然,跨部边事实上可以单向(但没必要)。
-
复杂度 \(O(n^2(n+m))\)。
P2598 [ZJOI2009] 狼和羊的故事
-
题意略。知道这是网络流的话不太难,没猜到是网络流就寄了,我是在题单里做到的那种,所以真被 shock 一下我估计我也做不出来...
-
\(S\to 1(+\infty),2\to T(+\infty),\text{四连通}(1)\)。然后求最小割。
-
一个比较有趣的问题是,为什么这样的篱笆一定是连续的。
-
感性理解的话证明不难:有豁口的话一定还有 \(S\to T\) 的路径。
-
或者说,这个网络和原图的连通性是等效的。
P2774 方格取数问题
-
题意略。一看就很最小割啊。
-
相邻两个数至少有一个不选...考虑把每个点拆成 in 和 out。
-
对 \(i\),和所有四连通的 \(j\) 连 \(out_i->in_j(+\infty)\)。
-
\(S->out,in->T(a?)\)...好像有问题,考虑 \(1\times 2\) 的一个网格,建出来图发现它会割两条边。可能会各割一次或者把某个割两次。
-
黑白染色。黑点和 \(S\) 连,白点和 \(T\) 连(边权为 \(a_i\));黑连向白(\(+\infty\))。
-
啊于是这样一来拆点也没有必要了。\(O((n^2)^2(n^2))=O(n^6)\),不过网络流复杂度大家都知道。
P2762 太空飞行计划问题
-
题意略。妙妙题!至少对现在(写到这里时)的我来说!
-
输入数据确实毒,我的想法是
getline
进来在上面跑mygc
。不过这个不重要。 -
首先费用流的话,有点怪,因为不知道流量是干嘛的;最大流也有点怪,负流量是什么鬼;最小割?没道理啊。
-
我有一个想法:跑费用流。流量代表做几个实验,依次把从 \(S\) 流出的流量设为 \(1\sim m\),挨个试一试,当然实际上是在残量网络上加流量。
-
但是,怎么表示仪器的存在性,或者说实验对其存在性的依赖?...好像没办法。
-
贺讨论区后想到了一种非常妙(可能只是因为我最小割做得少)的建模:用边表示不买某个仪器,而非买某个仪器! -
\(S\to eq(cost),eq\to ex(+\infty),ex\to T(value)\),这里 \(eq\) 表示 equipment,\(ex\) 表示 experiment,中间的那种边只有有依赖关系的才连。
-
于是得解。构造参看最小割最大流定理的构造证明。
-
另外本题的建模有更一般化的做法并可以引出一系列问题,参看《最小割模型在信息学竞赛中的应用》-胡伯涛。
P4174 [NOI2006] 最大获利
-
题意略。可以看出和上一道题基本同构。
-
首先令 \(ans=\sum cost\),相当于建出所有基站;然后从源点向基站连边,流量为不建它能省的钱;从用户群向汇点连边,容量为其对应的获益;基站到用户群之间的边保留,容量为正无穷。
-
复杂度 \(O((n+m)^2(n+3m))=O(m^3)\),唉算了你管它干啥。
P3355 骑士共存问题
- 题意略。二分图最大独立集板子,和方格取数没啥区别。略。
某 T1 割
P5934 [清华集训2012] 最小生成树
-
题意:给出一张无向连通图,求至少删多少条边后给定的一条边既可以在最小生成树中,又可以在最大生成树中。
-
数据范围:\(n\leqslant 2\times 10^4,m\leqslant 2\times 10^5\)。
-
首先,基于 Kruskal 算法,边权为 \(K\) 的边在最小/大生成树中,就代表着仅保留 \(<K/>K\) 的边时原图不连通。
-
故分别建图跑最小割,源汇点分别为给定边的源汇点(因为给定边必须对连通有贡献),将两个最小割求和即可。之所以是求和是因为两张图的边集无交。
-
时间复杂度...就,理论 \(O(n^2m)\) 呗。我也不知道这么大的数据范围怎么敢出的。upd:由 OI Wiki,在单位网络上增广轮数为 \(\min(V^\frac{2}{3},E^\frac{1}{2}\),于是纸面复杂度 \(1.47\times 10^8\),能过是有道理的。
P5039 [SHOI2010] 最小生成树
-
题意:给出一张无向连通图,可以花费 \(1\) 的代价将某条边的边权 \(+1\),求使给定边一定在最小生成树中的最小代价。
-
数据范围:\(n\leqslant 5\times 10^2,m\leqslant 8\times 10^2\)。
-
沿用上一题的结论。发现边权差不太好处理,思考发现割它的代价即为它的容量,于是令容量为边权差即可。解决,复杂度 \(O(n^2m)\)。