算法设计复习(三):最大流(最小切)问题

1.切(s-t cut)的定义:

算法设计复习(三):最大流(最小切)问题_第1张图片

最小切问题当然就是找到一个最小的s-t cut

2.流问题:

流是一些s到t的简单路径,满足两个条件:

1)路径中每条边的流量f(e)小于等于容量c(e)

2)路径中每个顶点(除了源点s与汇点t),流入的流量必须等于流出的流量

定义总流量:

3.对于任意s-t割(A,B),s-t流的值等于A的流出值减去A的流入值:

算法设计复习(三):最大流(最小切)问题_第2张图片

4.s-t flow 一定小于 s-t cut,证明:

算法设计复习(三):最大流(最小切)问题_第3张图片

很显然,如果一个流等于cap(A,B),它一定即是最大流,又是最小割

5.求解最大流:

1)贪心算法不适用

下图用贪心算法得到最大流是20,显然我们可以得到一个30的流

算法设计复习(三):最大流(最小切)问题_第4张图片

2)Ford-Fulkerson Algorithm

a.先找到一个s-t路径,对于该路径构造一个剩余图Gf:所有经过的边e,构造一条f(e)的反向边,和一条c(e)-f(e)的正向边,反向边的构造相当于如果这条路径是错误的,给了我们返回的机会

b.在Gf 中寻找新的简单路径,把每条路径的最小容量边容量称为bottleneck,每次经过正向边加上一次bottleneck,每经过一个反向边剪去一次bottleneck,可以证明每次找到新的路径总流量是增大的

c.构造新的剩余图,迭代上述操作,知道找不到增广路径后停止迭代

伪代码:

算法设计复习(三):最大流(最小切)问题_第5张图片

6.证明最大流等于最小切

通过以下三点等价来证:

I 存在一个切(A,B)和流f, 使cap(A,B) = v(f)

ii 这个流即是最大流

iii f不存在增广路径

算法设计复习(三):最大流(最小切)问题_第6张图片

算法设计复习(三):最大流(最小切)问题_第7张图片

7.寻找更好的增广路径(E-K算法)

在FF算法中,增广路径的选择无疑是十分重要的,好的选择可能只会用到多项式时间,不好的选择可能要用指数时间,甚至永远不会终止。

E-K算法原则:

算法设计复习(三):最大流(最小切)问题_第8张图片

从直觉来说,我们希望每次找到的都是bottleneck最大的增广路径,但是这是不必要的,因为寻找最大bottleneck也会耗费时间,我们只需要维持一个scaling parameter ,并找到剩余图的子图使每条边都容量大于这个参数。

算法设计复习(三):最大流(最小切)问题_第9张图片

只在子图中寻找增广路径,并逐渐减小scaling parameter,直到该值为1

伪代码:

算法设计复习(三):最大流(最小切)问题_第10张图片

E-K算法的时间复杂度:O(m^2*logc)

你可能感兴趣的:(算法设计复习(三):最大流(最小切)问题)