Ford-Fulkerson最大流算法数学原理详解
欢迎访问我的主页: https://heeheeaii.github.io/
一、基础概念与定义
1.1 流网络基本结构
流网络定义:
-
网络结构:有向图 G = (V, E),包含源点 s 和汇点 t
-
边容量:c(u,v) ≥ 0,表示边 (u,v) 的最大流量容量
-
流量函数
:f(u,v) 表示边 (u,v) 上的实际流量,满足容量约束:
0 ≤ f(u,v) ≤ c(u,v)
1.2 流量守恒定律
中间节点的流量守恒 对于任意中间节点 u(u ≠ s 且 u ≠ t):
∑[v∈V] f(v,u) = ∑[v∈V] f(u,v)
含义:流入节点 u 的总流量 = 流出节点 u 的总流量
源点和汇点的流量性质
- 源点 s:∑[v∈V] f(s,v) - ∑[v∈V] f(v,s) = |f| (净输出等于总流量)
- 汇点 t:∑[v∈V] f(v,t) - ∑[v∈V] f(t,v) = |f| (净输入等于总流量)
1.3 残存网络
给定当前流 f,残存网络中的残存容量定义为:
残存容量(u,v) = {c(u,v) - f(u,v) 如果原图存在边 u→v(正向边剩余容量)f(v,u) 如果原图存在边 v→u(反向边可撤销容量)0 其他情况
}
二、核心理论基础
2.1 最大流-最小割定理
定理陈述:在任何流网络中,最大流的值等于最小割的容量。
割的定义: 割 (X,Y) 将节点集 V 分为两个不相交的子集,使得 s ∈ X,t ∈ Y。
割的容量 = ∑[u∈X,v∈Y] c(u,v)
证明过程
方向1:最大流 ≤ 最小割
对于任意流 f 和任意割 (X,Y):
|f| = 从 X 到 Y 的净流量= ∑[u∈X,v∈Y] f(u,v) - ∑[v∈Y,u∈X] f(v,u)≤ ∑[u∈X,v∈Y] c(u,v) - 0 (容量约束 + 流量非负)= 割(X,Y)的容量
方向2:最大流 ≥ 最小割
当 Ford-Fulkerson 算法终止时的流 f*:
-
构造关键割:
- X = {从 s 在残存网络中能到达的所有节点}
- Y = V - X(注意:t ∈ Y,否则算法未终止)
-
关键性质:
- 若 u ∈ X, v ∈ Y 且原图有边 (u,v),则 f*(u,v) = c(u,v)(正向边饱和)
- 若 u ∈ X, v ∈ Y 且原图有边 (v,u),则 f*(v,u) = 0(反向边无流)
-
等式成立:
|f*| = ∑[u∈X,v∈Y] f*(u,v) - ∑[v∈Y,u∈X] f*(v,u)= ∑[u∈X,v∈Y] c(u,v) - 0= 割(X,Y)的容量
结论:最大流 = 最小割
2.2 增广路径定理
定理:流 f 是最大流 ⟺ 残存网络中不存在从 s 到 t 的路径
证明要点:
- 充分性:若残存网络中存在 s 到 t 的路径,则可继续增加流量,f 非最大
- 必要性:若 f 是最大流,则残存网络中必无 s 到 t 的路径
三、算法运作机制
3.1 反向边的数学含义
作用机制:允许算法"撤销"先前的流量分配决策
数学表示:
- 如果边 (u,v) 当前流量为 f(u,v)
- 残存网络中反向边 (v,u) 的容量 = f(u,v)
- 表示最多可撤销 f(u,v) 单位的流量重新分配
3.2 流量增广操作
增广步骤:
-
寻找增广路径:在残存网络中找到 s 到 t 的路径 P
-
计算增广量:δ = min{残存容量(u,v) | (u,v) ∈ P}
-
更新流量
:沿路径 P 的每条边 (u,v):
- 若为正向边:f(u,v) ← f(u,v) + δ
- 若为反向边:f(v,u) ← f(v,u) - δ
四、算法正确性分析
4.1 终止性保证
整数容量情况:
- 每次增广至少增加 1 单位流量
- 流量存在上界(等于最小割容量)
- 因此算法必然在有限步内终止
4.2 最优性证明
算法终止时的流 f* 满足:
-
终止条件:残存网络中 s 无法到达 t
-
构造最小割
:
- X = {从 s 在残存网络中可达的节点}
- Y = V - X
-
流量等于割容量:|f*| = 割(X,Y)的容量
-
最优性结论:根据最大流-最小割定理,f* 是最大流
五、反向边必要性分析
5.1 经典反例
网络结构:
S → A (容量100) A → T (容量100)
S → B (容量100) B → C (容量100)
A → C (容量1) C → T (容量100)
5.2 贪心策略的失败
错误的增广序列:
第1次:S→A→C→T,流量 = 1
第2次:S→A→T, 流量 = 99
第3次:S→B→C→T,流量 = 99
总流量 = 199 (非最优)
5.3 反向边的拯救
修正增广:
第4次:S→B→C→A→T,流量 = 1
- 利用反向边 C→A 撤销第1次的次优分配
- 最终达到最优解:总流量 = 200