Processing math: 100%

最大流

总结一下最大流的各种算法

最大流问题

设赋权有向图 D(V,E,C),其中每一条边的权值cC表示这条边的容量。流f:VVR是对于边eE的函数。我们定义唯一的开始节点S是源,只发出流量;唯一的结束节点T是汇,只接受流量。一个流网络具有以下的形式

  1. 流入流量取正号,流出流量取负号
  2. 每条边的流量|f(u,v)|不能超过容量
  3. 流经中间节点的流量无损耗

形式化的表述如下
f(u,v)=f(v,u)f(u,v)c(u,v)Σf(u,)=0,u{S,T}

特别注意对于条件1,可以得到只要有向边(u,v)上存在流f(u,v),那有向边(v,u)上必然存在f(v,u)=f(u,v)。特别地该边不存在的情况可以表示成c(v,u)=0,但是实际上我们只考虑流量为正的边,所以在一些教程上也只画出了这样的边。
最大流问题就是求解通过流网络从源S能够流出的最大流量,也就是汇T能够得到的最大流量。

Ford Fulkerson方法

最大流最小割定理

对于网络流G(V,E),以下命题等价:

  1. fG的最大流
  2. 残余网络不存在增广路径
  3. 最大流=最小割

残量网络

残量网络是一个双向图。
定义剩余容量cv(u,v)
c(u,v)f(u,v)(u,v)E


由cv为权的新有向图称为残量网络。并且当f(u,v)为负数时,cv(u,v)会大于c(u,v)

增广路径

Ford Fulkerson方法的Edmonds Karp实现

与朴素Ford-Fulkerson算法不同的是Edmonds-Karp要求每次找长度最短的增广路径,即使用BFS查找增广路径。
时间复杂度是O(nm2),空间复杂度是O(n2)

Dinic算法

SAP算法