最小割,指割去一些边使得源点和汇点不连通的最小花费,有最大流最小割定理。
网络流系列文章
概念
割
对于一个网络流图 $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 |
|
方案
我们可以通过从源点 $s$ 开始 $\text{DFS}$,每次走残量大于 $0$ 的边,找到所有 $S$ 点集内的点。
1 |
void dfs(int u) { |
割边数量
只需要将每条边的容量变为 $1$,然后重新跑 $\text{Dinic}$ 即可。
问题模型
有 $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$ 集合,如果把物品之间的边割开,表示这两个物品不放在同一个集合。
最小割就是最小花费。
习题
网络流 24 题
- 「Luogu 1251」餐巾计划问题
- 「Luogu 2754」家园
- 「Luogu 2756」飞行员配对方案问题
- 「Luogu 2761」软件补丁问题
- 「Luogu 2762」太空飞行计划问题
- 「Luogu 2763」试题库问题
- 「Luogu 2764」最小路径覆盖问题
- 「Luogu 2765」魔术球问题
- 「Luogu 2766」最长不下降子序列问题
- 「Luogu 2770」航空路线问题
- 「Luogu 2774」方格取数问题
- 「Luogu 2775」机器人路径规划问题
- 「Luogu 3254」圆桌问题
- 「Luogu 3355」骑士共存问题
- 「Luogu 3356」火星探险问题
- 「Luogu 3357」最长k可重线段集问题
- 「Luogu 3358」最长k可重区间集问题
- 「Luogu 4009」汽车加油行驶问题
- 「Luogu 4011」孤岛营救问题
- 「Luogu 4012」深海机器人问题
- 「Luogu 4013」数字梯形问题
- 「Luogu 4014」分配问题
- 「Luogu 4015」运输问题
- 「Luogu 4016」负载平衡问题