最大流基础(Maximum Flow Basis)
1. 最大流问题定义
1.1 流网络(Flow network)
Def. A flow network is a tuple \(G = (V, E, s, t, c)\):
- Digraph \((V, E)\) with source \(s ∈ V\) and sink \(t ∈ V\).
- Capacity \(c(e) ≥ 0\) for each \(e ∈ E\).
定义. 一个流网络可以定义为一个元组\(G = (V, E, s, t, c)\), 满足如下条件:
- 有向图\((V, E)\)中含义一个源点\(s ∈ V\)以及一个汇点\(t ∈ V\).
- 每条边都有相应的容量\(c(e) ≥ 0\).
1.2 最大流问题(Maximum-flow problem)
Def. An flow \(f\) is a function that satisfies:
- For each \(e ∈ E\) : \(0\le f(e)\le c(e)\) [capacity]
- For each \(v ∈ V – \set{s, t}\) : \(\displaystyle \sum_\text{e in to v}f(e)=\sum_\text{e out of v}f(e)\) [flow conservation]
定义. 一个流\(f\)是指一个满足如下条件的函数:
- 对于边\(e ∈ E\): \(0\le f(e)\le c(e)\). [容量]
- 对于顶点\(v ∈ V – \set{s, t}\): \(\displaystyle \sum_\text{e in to v}f(e)=\sum_\text{e out of v}f(e)\). [流量守恒]
Def. The value of a flow \(f\) is: \(val(f)=\displaystyle \sum_\text{e out of s}f(e)-\sum_\text{e in to s}f(e)\).
定义. 一个流\(f\)的值可以定义为: \(val(f)=\displaystyle \sum_\text{e out of s}f(e)-\sum_\text{e in to s}f(e)\).
Max-flow problem. Find a flow of maximum value.
最大流问题. 找到一个流,它的值最大.
2. 最大流问题算法
三种解决最大流问题算法, B站upShusenWang的视频.
2.1 福特-富尔克森算法(Ford–Fulkerson algorithm)
13-2: Ford-Fulkerson Algorithm 寻找网络最大流
2.2 埃德蒙兹-卡普算法(Edmonds-Karp Algorithm)
13-3: Edmonds-Karp Algorithm 寻找网络最大流
2.3 迪尼茨算法(Dinic's algorithm)
13-4: Dinic's Algorithm 寻找网络最大流
3. 扩展
3.1 瓶颈边(Bottleneck edge)
定义. 流网络中的一条边被称为瓶颈边是指其容量的增加将导致最大流的增加。
问题. 给出一个识别流网络中瓶颈边的高效算法
算法如下:
- 用Ford-Fulkerson算法, 得到最终的剩余图
- 计算两个集合: 剩余图中所有从源点\(s\)可达的节点定义为集合\(A\), 剩余图中所有可以到达汇点\(t\)的节点定义为集合\(B\).
- 任何一个连接集合\(A\)中节点到集合\(B\)中节点的边\(e\), 都是瓶颈边.
*第二步中, 求集合\(A\)可以通过在剩余图中从源点\(s\)深搜求得, 集合\(B\)可以通过在剩余图的反向图中从汇点\(t\)深搜求得. 此步骤时间复杂度为\(O(m)\), 其中m为剩余图中边的数量.
正确性: 增加\(e\)的容量, 一定会使剩余图产生一条新的增广路径, 从而使最大流增大.