1. 网络流基础概念解析
网络流理论是图论中的一个重要分支,主要研究在网络中物质流动的规律和特性。想象一下城市供水系统:水源是起点,各家各户的水龙头是终点,水管就是连接它们的边,而管道的粗细决定了水的流量上限。这就是网络流最直观的现实映射。
在网络流模型中,我们通常用有向图G=(V,E)来表示:
- V代表顶点集合(如交叉路口、中转站)
- E代表有向边集合(如单向道路、传输管道)
- 每条边e∈E都有一个非负的容量c(e)(如管道承压能力)
- 存在唯一的源点s(起点)和汇点t(终点)
关键提示:虽然现实中的网络往往是无向的(如双向道路),但在理论建模时通常转化为两条反向的有向边来处理。
2. 最大流问题详解
2.1 流函数的数学定义
一个合法的流函数f:E→R⁺需要满足两个核心条件:
- 容量约束:对于∀e∈E,0≤f(e)≤c(e)
- 流量守恒:对于∀v∈V{s,t},流入量=流出量
最大流问题的目标就是找到从s到t的流函数f,使得总流量|f|=∑f(s,v)达到最大。这相当于在保证管道不爆裂(容量约束)且中途不积压(流量守恒)的前提下,最大化整个系统的吞吐量。
2.2 Ford-Fulkerson方法
最经典的求解框架是Ford-Fulkerson方法,其核心思想是:
- 初始化零流(所有边流量为0)
- 在残量网络中寻找增广路径
- 沿路径增加流量
- 重复直到没有增广路径为止
残量网络G_f是对原图的改造:
- 对于原图中的边e=(u,v),在G_f中保留其剩余容量c(e)-f(e)
- 添加反向边(v,u)并设置容量为f(e)
python复制# Ford-Fulkerson算法伪代码
def ford_fulkerson(G, s, t):
max_flow = 0
# 初始化残量网络(原图容量)
residual = G.copy()
while True:
# 使用BFS寻找增广路径
path, min_capacity = find_augmenting_path(residual, s, t)
if not path:
break
