网络流
本文参考了南京大学蒋炎岩老师的讲解(B站视频链接)
考虑割的定义
对于有向图
G
(
V
,
E
)
G(V,E)
G(V,E)
对于DFS/BFS,每次搜索会将新的节点
v
∈
V
v \in V
v∈V 纳入已经搜索的集合
S
S
S 中
则对于尚未搜索的部分,定义为集合 V − S = T V - S = T V−S=T,则必然存在 S , T S,T S,T 满足 G G G 的 s − t s-t s−t 割
- S ∩ T = V , S ∪ T = ∅ S \cap T = V, S \cup T = \emptyset S∩T=V,S∪T=∅
- s ∈ S , t ∈ T s \in S, t \in T s∈S,t∈T
即起点/终点分别位于两个集合当中,这个边集合称作割
定义割的大小 ∣ { ( u , v ) ∈ E ∣ u ∈ S , v ∈ T } ∣ |\{(u,v) \in E|u \in S, v \in T\}| ∣{(u,v)∈E∣u∈S,v∈T}∣,即按照 S → T S \rightarrow T S→T 方向穿过割的边数
因此对于 G G G 中任意两点间 s → t s \rightarrow t s→t找不到路径,等价于至少存在一个 s ∈ S , t ∈ T s \in S, t \in T s∈S,t∈T的 s − t s-t s−t 割大小为 0 0 0
不止一条路径
求 G G G 中有多少不相同的 s → t s \rightarrow t s→t
- 可共享节点,不能共享边
对于大小为 n n n 的 s → t s \rightarrow t s→t 割,必然存在至多 k ( k ≤ n ) k(k \leq n) k(k≤n) 条 s → t s \rightarrow t s→t 的路径(上界)。
同时,如果能找到 m ( m ≤ k ) m(m \leq k) m(m≤k) 条不相交路径(下界),就证明了一共有 k k k 条不相交路径。
寻找不相交路径的数量
Ford-Fulkerson 算法
- 使用DFS/BFS找到一条路径 L L L
- 对于 e ∉ L e \not\in L e∈L,保持方向不变,对于 e ∈ L e \in L e∈L,将其反向
- 对于更新后的图(称作残余网络),重复步骤
1
,
2
1,2
1,2,若不满足
1
1
1,则终止
对于终止的 Ford-Fulkerson 算法,必有割 s → t s \rightarrow t s→t 大小为 0 0 0.
当算法终止时,假设有 m m m 条路径,则必有真实路径数 k , k ≥ m k,k \geq m k,k≥m,若同时有最小割 t = m t = m t=m,则必有路径数量为 k k k
最大流和最小割
考虑带权图
带权图等价于多重边。如权重为 20 20 20 的边 a → 20 b a \rightarrow_{20}b a→20b,等价于 20 20 20 条权重为 1 1 1(无权)的边即 20 × a → b 20 \times a\rightarrow b 20×a→b。
边的权值称作容量
若存在
p
p
p 条有重复边的路径
{
x
1
,
.
.
.
,
x
p
}
\{x_1,...,x_p\}
{x1,...,xp},则定义了如下的线性优化目标
min
∑
i
=
1
p
x
i
\min \sum\limits ^{p}_{i = 1} x_i
mini=1∑pxi
其满足约束条件
x
1
+
.
.
.
≤
a
x
2
+
.
.
.
≤
b
…
x
i
≥
0
x_1 + ... \leq a \\ x_2 + ... \leq b\\\dots\\x_i \geq 0
x1+...≤ax2+...≤b…xi≥0
其中
a
,
b
,
.
.
.
a,b,...
a,b,... 表示
x
1
,
x
2
,
.
.
.
x_1,x_2,...
x1,x2,... 公共边中最小的容量。这就是网络流的原始表述。