最小割
概念¶
割¶
对于一个网络流图 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 已经达到最大。
代码¶
最小割¶
通过 最大流最小割定理,我们可以直接得到如下代码:
参考代码
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 点集内的点。
1 2 3 4 5 6 7 | |
割边数量¶
只需要将每条边的容量变为 1,然后重新跑 Dinic 即可。
Warning
这个割边数量并没有保证是在最小割的前提下,所以最下方的例题不能做如此简单的处理。具体解法可以参见题解,不要被这句话误导了。
问题模型 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 连一条有向边,边权即为该点点权的相反数。原图上所有边权改为 inf。跑网络最大流,将所有正权值之和减去最大流,即为答案。
几个小结论来证明:
- 每一个符合条件的子图都对应流量网络中的一个割。因为每一个割将网络分为两部分,与 s 相连的那部分满足没有边指向另一部分,于是满足上述条件。这个命题是充要的。
- 最小割所去除的边必须与 s 和 t 其中一者相连。因为否则边权是 inf,不可能成为最小割。
- 我们所选择的那部分子图,权值和 = 所有正权值之和 - 我们未选择的正权值点的权值之和 + 我们选择的负权值点的权值之和。当我们不选择一个正权值点时,其与 s 的连边会被断开;当我们选择一个负权值点时,其与 t 的连边会被断开。断开的边的边权之和即为割的容量。于是上述式子转化为:权值和 = 所有正权值之和 - 割的容量。
- 于是得出结论,最大权值和 = 所有正权值之和 - 最小割 = 所有正权值之和 - 最大流。
习题¶
- 「USACO 4.4」Pollutant Control
- 「USACO 5.4」Telecowmunication
- 「Luogu 1361」小 M 的作物
- 「SHOI 2007」善意的投票
- 太空飞行计划问题
build本页面最近更新:,更新历史
edit发现错误?想一起完善? 在 GitHub 上编辑此页!
people本页面贡献者:OI-wiki
copyright本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用