算法学习笔记(18): 网络流最小割
最小割概念
先忽略网络流,对于一个联通图的割是边的集合,删去这些边可以使原来图上的点集连通性变成两个块。
网络流的割要求两个联通块分别包含S和T(源点和汇点)。其中最小割指的是割中所有边的容量最小。
可以理解为一个联通图有很多边带权,求得一个割,称所有割中权值最小的为最小割。
最大流最小割定理
结论:对于任意网络,其最大流就等于最小割。
证明:对于任意割,任意流,都有流 ≤ 割,因为删去割会导致最大流直接归0。
当不存在增广路径时的流与割的关系:
- 如果在残差网络中不存在从 s 到 t 的路径,则说明此时的流量已经是最大流。
- 此时我们可以将节点集合 V 划分为两个部分:从 s 出发可以到达的节点集 S,以及其他节点 T=V−S。
- 边从 S 指向 T 的所有边构成一个割,并且这个割的容量即为从 S 到 T 的所有边的容量之和。
证明最大流等于最小割:
- 由于在增广路径不存在的情况下,割的容量等于当前的流量。
- 并且,由于流量在之前的步骤中是通过增广路径一步步增加的,直到无法再增加,因此此流量必然是最大流。
- 也就是说,此时的最大流等于最小割的容量。
通过最小割可以把最大流计算用于许多问题的解决
二选一关联模型
问题模型
有n个物品和两个集合A, B,如果一个物品没有放入A会花费 ai, 如果没有放入b 会花费 bi, 对于某几对物品,如果这对物品不在一个集合内,就会额外花费wi。每个物品只能在一个集合,求最小花费。
构造方法
- 建立超级源点 s 和超级汇点 t
- 对于每个物品抽象成每个点,与 s 连接权值为 ai的边, 与 t 连接权值为bi 的边
- 对于每对物品关联,对这两个点建立wi的双向边
- 最小花费就是最小割
(注:如果是多个物品,可以建立新节点建立联系)
证明&说明
对于每个物品而言,选择放入A即将和 t 的边加入割,与s就不需要加入割了。这是一个二选一的关系。
对于额外关系,如果p1,p2不在同一个集合,p1p2之间的双向边就会有一个和原来的两条边形成ST通路,需要将其加入割边。所以对于题目任意符合条件的选择,都是对应构造网络流的一个割。
将费用最小化即是最小割。
二分图最大带权独立集&最小点权覆盖集
概念
- 独立集:点集,独立集中的所有点之间都没有边
- 覆盖集:点集,所有点的边就是整个图的边
- 二分图:或称二部图,指图中的点可以分成两部分,在同一个部分的点之间没有边
问题模型
最小点权覆盖集**:**
给定一张二部图,每个点都有自己的权值,找出所有点覆盖集中权值最大的。
最大带权独立集:
给定一张二部图,每个点都有自己的权值,找出所有独立集中权值最大的独立集。
根据两者的互补关系可得:
最大带权独立集权值 = 全部点权值 - 最小点权覆盖集权值
故我们直接考虑最小点权覆盖集权值
构造方法
- 建立超级源点 s 和超级汇点 t
- 将二部图分为两部分处理,一部分连接超级源点,边权为点权
- 另一部分连接 t, 边权为点权
- 原来二部图上的所有边改为有向边,从第一部分连接到第二部分,权值为INF
证明&说明
结论:最小点权覆盖集权值就是最小割
对于一个割来说,当我们选择了二部图中的一个点时,也就是将这个点与s或t的边断开,此时,它后面连接到的边的点就没有强制性要求了,
如果我们没有选择一个点,也就是对应的边不加入割,那么为了保证不连通,这个点在二部图内连接到的后面的点都需要对应的边作为割,恰恰好对应了最小点覆盖的规律,所以点覆盖集对应的边也就必定是原图的一个割集。
则最小点权覆盖集权值就是最小割也就是最大流。
最大带权独立集权值 = 全部点权值 - 最小点权覆盖集权值 = 全部点权值 - 最大流
最大权闭合子图问题
问题模型
给定一个点权有向图,选择一个权值和最大的子图,使得子图中每个节点指向的节点也在图中。
构造方法
- 建立超级源点 s 和超级汇点 t
- 如果一个节点x的权值w是正,建立 s → x 的权值为w
- 如果节点x的权值为-w是负值,则建立一条 x → t 的边,权值为w。
- 保留原图所有边,且权值为INF。
- 用所有正权值减去最大流即可。
证明&说明
结论1:每一个符合最大权闭合子图条件的子图都对应流量网络中的一个割。
这里的子图对应到割有以下含义:
- 正权值的点被选择代表 s → x 的边不在割内
- 正权值的点不被选择代表 s → x 的边在割内
- 负权值的点被选择代表 x → t 的边在割内
- 负权值的点不被选择代表 x → t 的边不在割内
割为了保证不连通:
- 如果选择了 s → x 的边作为割,那么关于这个点的后继节点都不用它考虑了,爱选不选。相当于没有选择这个点。
- 如果没选择 s → x 的边作为割,那么为了保证不连通,需要后面所有的负权点 x → t 的边作为割。相当于选择了这个点。
结论2:我们所选择的那部分子图,权值和 = 正权值和 - (没选的正权 + 选了的负权(取正))
有趣的是,我们正权值点选择是反的,而负权值选择则是对应的,但是负权值的点对应边的权值恰好都被取负成为正数。因此现在我们不妨考虑减去值,将正权值的点也作为减去值,此时选择这个点就要减去,不选就不减去,恰好此时的闭合子图所有点代表的边的权值之和就是我们要减去的。
结论3:于是上述式子转化为:权值和 = 所有正权值之和 - 割的容量
最大权值和 = 所有正权值之和 - 最小割 = 所有正权值之和 - 最大流。