最小割
概念
割
对于一个网络流图 \(G=(V,E)\),其割的定义为一种 点的划分方式:将所有的点划分为 \(S\) 和 \(T=V-S\) 两个集合,其中源点 \(s\in S\),汇点 \(t\in T\)。
割的容量
我们的定义割 \((S,T)\) 的容量 \(c(S,T)\) 表示所有从 \(S\) 到 \(T\) 的边的容量之和,即 \(c(S,T)=\sum_{u\in S,v\in T}c(u,v)\)。当然我们也可以用 \(c(s,t)\) 表示 \(c(S,T)\)。
最小割
最小割就是求得一个割 \((S,T)\) 使得割的容量 \(c(S,T)\) 最小。
证明
最大流最小割定理
定理:\(f(s,t)_{\max}=c(s,t)_{\min}\)
对于任意一个可行流 \(f(s,t)\) 的割 \((S,T)\),我们可以得到:
如果我们求出了最大流 \(f\),那么残余网络中一定不存在 \(s\) 到 \(t\) 的增广路经,也就是 \(S\) 的出边一定是满流,\(S\) 的入边一定是零流,于是有:
结合前面的不等式,我们可以知道此时 \(f\) 已经达到最大。
代码
最小割
通过 最大流最小割定理,我们可以直接得到如下代码:
参考代码
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
|
方案
我们可以通过从源点 \(s\) 开始 DFS,每次走残量大于 \(0\) 的边,找到所有 \(S\) 点集内的点。
C++ | |
---|---|
1 2 3 4 5 6 7 |
|
割边数量
如果需要在最小割的前提下最小化割边数量,那么先求出最小割,把没有满流的边容量改成 \(\infty\),满流的边容量改成 \(1\),重新跑一遍最小割就可求出最小割边数量;如果没有最小割的前提,直接把所有边的容量设成 \(1\),求一遍最小割就好了。
问题模型 1
有 \(n\) 个物品和两个集合 \(A,B\),如果一个物品没有放入 \(A\) 集合会花费 \(a_i\),没有放入 \(B\) 集合会花费 \(b_i\);还有若干个形如 \(u_i,v_i,w_i\) 限制条件,表示如果 \(u_i\) 和 \(v_i\) 同时不在一个集合会花费 \(w_i\)。每个物品必须且只能属于一个集合,求最小的代价。
这是一个经典的 二者选其一 的最小割题目。我们对于每个集合设置源点 \(s\) 和汇点 \(t\),第 \(i\) 个点由 \(s\) 连一条容量为 \(a_i\) 的边、向 \(t\) 连一条容量为 \(b_i\) 的边。对于限制条件 \(u,v,w\),我们在 \(u,v\) 之间连容量为 \(w\) 的双向边。
注意到当源点和汇点不相连时,代表这些点都选择了其中一个集合。如果将连向 \(s\) 或 \(t\) 的边割开,表示不放在 \(A\) 或 \(B\) 集合,如果把物品之间的边割开,表示这两个物品不放在同一个集合。
最小割就是最小花费。
问题模型 2
最大权值闭合图,即给定一张有向图,每个点都有一个权值(可以为正或负或 \(0\)),你需要选择一个权值和最大的子图,使得子图中每个点的后继都在子图中。
做法:建立超级源点 \(s\) 和超级汇点 \(t\),若节点 \(u\) 权值为正,则 \(s\) 向 \(u\) 连一条有向边,边权即为该点点权;若节点 \(u\) 权值为负,则由 \(u\) 向 \(t\) 连一条有向边,边权即为该点点权的相反数。原图上所有边权改为 \(\infty\)。跑网络最大流,将所有正权值之和减去最大流,即为答案。
几个小结论来证明:
- 每一个符合条件的子图都对应流量网络中的一个割。因为每一个割将网络分为两部分,与 \(s\) 相连的那部分满足没有边指向另一部分,于是满足上述条件。这个命题是充要的。
- 最小割所去除的边必须与 \(s\) 和 \(t\) 其中一者相连。因为否则边权是 \(\infty\),不可能成为最小割。
- 我们所选择的那部分子图,权值和 \(=\) 所有正权值之和 \(-\) 我们未选择的正权值点的权值之和 \(+\) 我们选择的负权值点的权值之和。当我们不选择一个正权值点时,其与 \(s\) 的连边会被断开;当我们选择一个负权值点时,其与 \(t\) 的连边会被断开。断开的边的边权之和即为割的容量。于是上述式子转化为:权值和 \(=\) 所有正权值之和 \(-\) 割的容量。
- 于是得出结论,最大权值和 \(=\) 所有正权值之和 \(-\) 最小割 \(=\) 所有正权值之和 \(-\) 最大流。
习题
- 「USACO 4.4」Pollutant Control
- 「USACO 5.4」Telecowmunication
- 「Luogu 1361」小 M 的作物
- 「SHOI 2007」善意的投票
- 太空飞行计划问题
本页面的全部内容在 小熊老师 - 莆田青少年编程俱乐部 0594codes.cn 协议之条款下提供,附加条款亦可能应用