网络流
给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow).

对于每个边,我们定义了3个属性:
- capacity: 用C
表示,最大容量,上图中边的数值就是capacity - flow: 用F
表示,每条边的流量 - residual: 用R
表示,残留,R = C - F
斜对称性:F
对于上图,假如存在一条流的路径:S->A->C->T. 那么这条路径的流就是这条路径的所有边的最大残留的最小值,也就是R=12. 此时,可以更新每条边的flow和residual, F=0+12=12, R=16-12=4, F=0+12=12, R=12-12=0, F
最大流
一般使用Edmonds-Karp算法,即最短路径增广算法,简称EK算法。
通过多次运行BFS算法,得到一条增广路,也就是从S到T的可行的流大于0的路径,然后更新相关边的属性值,其中有一点要注意:设这条路径的流是flow,则flow
下面是一个运行EK算法的例子:黑色数字表示残留值,一开始残留值就是最大容量值,红色数字表示流量值。
第一次运行BFS得到一个增广路:

更新残留值:

第二次运行BFS算法得到一个增广路

更新残留值:

第三次运行BFS得到一个增广路

更新残留值:

最小割
最大流最小割定理(Maximum Flow, Minimum Cut Theorem):网络的最大流等于最小割
我们把S能到达的点集设为s, 不能到达的点集设为t,构造一个割集C[s,t]。如下图所示

C[s,t] 中含有边,
其中满流边是前三个,它们构成了最小割。