1. CLRS 第 26 章 Ford-Fulkerson 在 BFS/DFS 增广路径选择与残留网络维护。
请说明 CLRS 第 26 章最大流算法中,Ford-Fulkerson 方法如何用 BFS/DFS 选择增广路径,并维护残留网络?
- 最大流最小割定理与增广路径思想
- BFS 选择最短增广路径(Edmonds-Karp)保证多项式时间
- 残留网络(residual network)的维护与反向边
Ford-Fulkerson 是求最大流的通用方法:不断在残留网络中寻找从源 s 到汇 t 的增广路径,沿路径增加流量,直到没有增广路径为止,此时流量即最大流(由最大流最小割定理保证)。增广路径的选择方式决定复杂度:用 DFS 找任意增广路径时复杂度可能与流量值相关(O(E*|f|)),可能很慢;用 BFS 找最短(边数最少)增广路径即 Edmonds-Karp 算法,复杂度 O(V*E^2),是多项式时间。残留网络每个正流量边对应一条反向边,用于"撤销/调整"之前的流量分配,这是增广的关键。工程实现中要维护反向边,增广时更新正向边与反向边。
核心是"增广 + 残留网络":残留网络允许反向增广,从而修正次优分配。选择 BFS(Edmonds-Karp)保证最短路径增广,从而多项式时间。Dinic 进一步用 BFS 分层 + 多次 DFS 阻塞流,把复杂度降到 O(V^2 E),是工程上最常用实现。
// Edmonds-Karp 简化思想:BFS 找增广路径
class Edge { int to, rev; long cap; }
// BFS 返回 true 时有增广路,更新 parent 与 pathCap
// 残留网络用 Edge 对象,cap 为剩余容量,反向边 rev 指向对边