1.网络流
容量网络是一个有向图,图的边 ( u , v ) 有非负的权 c ( u , v ) ,被称为容量。
图中有一个被称为源(只有出边)的节点和一个被称为汇(只有入边)的节点。
实际通过每条边的流量记为 f ( u , v ) 。
残量网络是一个结构和容量网络相同的有向图,只不过边的权值为c ( u , v ) ? f ( u , v ) 。所有边上的流量集合被称为网络流。
在容量网络中,满足以下条件的网络流被称为 可行流。
? 容量限制:
0 ≤ f ( u , v ) ≤ c ( u , v )
? 流量守恒:对于非源汇节点 u ,满足
? 反对称性:f ( u , v ) = ? f ( v , u )
有最大流量的网络流称为 最大流。
给定一个可行流 f={fij}。若 fij = Cij,称<vi, vj>为饱和弧;否则称<vi, vj>为非饱和弧。
若 fij = 0,称<vi, vj>为零流弧;否则称<vi, vj>为非零流弧。
定义一条道路 P,起点是 S、终点是 T。把 P 上所有与 P 方向一致的弧定义为正向弧,正向弧的全体记为 P+;把 P 上所有与 P 方向相悖的弧定义为反向弧,反向弧的全体记为 P-。
譬如在上图中,P = (V1(S), V2, V3, V4(T)),那么
P + = { <V1, V2>, <V3, V4>}
P - = {<V2, V3>}
给定一个可行流 f,P 是从 S到 T的一条道路,如果满足:
Fij是非饱和流,并且<i,j>∈ P+ 或 fij是非零流,并且<i,j>∈ P-
那么就称 P 是 f 的一条可改进路。 (有些书上又称可增广轨)之所以称作“可改进” ,是因为可改进路上弧的流量通过一定的规则修改,可以令整个流量放大。
。如果 A是V的一个子集,A-=V-A,s∈A,t∈A- ,则称边集(A, A- )为网络 N 的一个割,显然,若把某一割的弧从网络中丢去,则从 vs 到 vt 就不存在路。所以直观上讲,割是从 vs 到 vt的必经之道。
给定一割(A, A-),把其中所有弧的容量之和称为这个割的容量,记为 c(A, A- ) ,即:
网络 N中容量最小的割(A* ,A*- )称为 N的最小割。不难证明,任何一个可行流的流量 v(f)都不会超过任一割的容量,即 v(f)≤c(A,A-)。
可行流 f*为最大流,当且仅当不存在关于 f*的增广路径。
最大流最小割定理:在一个网络 N 中,从 vs 到 v t 的最大流的容量等于分离 vs,vt的最小割的容量。
Ford-Fulkerson算法
最大流问题实际上是求一可行流{f ij },使得 v(f)达到最大。
若给了一个可行流 f,只要判断 N 中有无关于 f 的增广路径,如果有增广路径,改进 f,得到一个流量增大的新的可行流;
如果没有增广路径,则得到最大流。
Dinic 算法总是寻找最短的增广路,并沿着它增广。
因为最短增广路在增广过程中始终不会变短。所以无需每次都通过宽度优先搜索寻找最短增广路。我们可以先进行一次宽度优先搜索,然后考虑由近距离顶点指向远距离顶点的边所组成的分层图,在上面进行深度优先搜索寻找最短增广路。
如果在分层图上找不到新的增广路了,则说明最短增广路长度确定变长了,或是不存在增广路了,于是重新通过宽度优先搜索构造新的分层图。每一步构造分层图的复杂度为 O(E) ,而每一步完成之后最短增广路的长度至少增加 1,由于增广路长度不会超过|v|-1,因此最多重复 O(|v|)步就可以了。
另外,在每次对分层图进行深度优先搜索寻找增广路时,如果避免对一条没有用的边进行多次检查(这个优化称作当前弧优化) ,就可以保证复杂度为 O(|E||V|) ,这样总的复杂度就是 O(|E||V|2) 。不过,该算法在实际应用中速度非常快,很多时候即使图的规模比较大也没有问题。