最小割

概述

  • 最小割在实质上是一种很...精妙的模型,与状压中的依赖式问题一样,都在一定程度上反映着决策之间的矛盾。

  • 每一条从 \(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)\)

posted @ 2023-03-10 13:51  未欣  阅读(121)  评论(0编辑  收藏  举报