网络流
流网络G(V,E)是一个有向图,其中每条边( u, v )∈E 均有一非负容量 c( u, v ) ≥ 0,规定:若 u , v ∉E,则 c( u, v ) = 0。
网络中由两个特殊点: 源点S和汇点T
网络中的边相当于是粗细不同的水管,c( u, v ) 相当于是水管的直径。
流网络G的流是一个实值函数 f : V×V -> R,且满足下列三个性质:
(1)容量限制:对于 ∀u,v∈V,要求f(u,v)≤c(u,v) 。
(2) 反对称性:对于 ∀u,v∈V,要求f(u,v)=−f(v,u) 。
(3) 流守恒性:对于 ∀u,v∈V−s,t,要求∑f(u,v)=0 。最大流最小割定理:最小割的容量等于最大流
割:割是一个边集,去掉这个边集会使得S到不了T。
最小割:边集容量最小的割。
残留容量:不超过容量限制下,某条边还能通过的额外的网络流量: Cf(u,v)=c(u,v)−f(u,v)
残留网络:可以理解成由可以容纳更多流的边组成的网络,起始网络也是一张残留网络。
增广路径:一条从源点到汇点的路径,要求该路径上每条边的残留容量均大于0。这条路径上可以增加的最大流量为所有边的残留容量中的最小值。
定理:如果 f 是具有源点S和汇点T的流网络(V,E) 中的一个流,则下列条件是等价的:
(1) f 是G 的一个最大流
(2) 残留网络 G 不包含增广路径
(3) 对G 的某个割,有 |f|=c(u,v)几种求最大流最小割的算法:
EdmondsKarp : 先在残留网络上进行BFS,找出一条增广路径,沿着增广路径进行增广,找出路径上的最大流F,即最小的残留容量。再更新残留网络,对于每条路径上的边 (u,v) , f(u,v)+=F , Cf(v,u)+=F 并且还有 f(v,u)−=F , Cf(v,u)+=F ,后两个式子保证流的守恒性,也给了系统纠正错误的机会。不断重复这两个过程,当无法找到增广路径时,最大流就找到了。
Dinic :因为 EdmondsKarp 算法中的BFS一次只增广一条增广路,时间上很浪费,所以 Dinic 算法再前者基础上进行了改进,在BFS时。给每个节点加上一个距离标号,表示与源点S的距离,在找增广路时只需沿着距离标号递增的顺序即可。相当于DFS,多次增广。
ISAP :ISAP在Dinic的基础上多了一个gap优化,gap[i]记录标号为i的点的个数,当网络出现断层即gap[i] == 0时,说明以及不存在增广路,也就找到了最大流。
预留推进 (push−relable) 算法: