最大流-最小分割问题(Max Flow and Min Cut Problem)

最大流-最小分割问题(Max Flow and Min Cut Problem)

作者:Bluemapleman([email protected])

麻烦不吝star和fork本博文对应的github上的技术博客项目吧!谢谢你们的支持!

知识无价,写作辛苦,欢迎转载,但请注明出处,谢谢!


文章目录

  • 最大流-最小分割问题(Max Flow and Min Cut Problem)
  • 引入
    • 最小分割问题
    • 最大流问题
  • Ford-Fulkerson算法
  • 最大流-最小割理论
    • 最大流和最小分割的关系
    • 增广路径定理
    • 最大流-最小分割定理
  • 时间复杂度分析
    • FF算法容易碰到的坏情况
  • 延伸:规约
  • 参考文献

前言:

引入

最小分割问题

最小割问题的针对的是这样的有向图,它的每个边都有一个值为正的容量(capacity)(即权值),表示该边最多允许多少数目的流动。同时,图中有唯一的源点s和唯一的目标点t。

最大流-最小分割问题(Max Flow and Min Cut Problem)_第1张图片

定义一个**分割(st-cut/cut)**为对图中所有顶点的一个二分,二分的两个集合A与B没有任何重合元素,且s在A中,t在B中。

再定义一个分割的容量(capacity)为所有从A到B的所有边的容量之和。

  • 两种不同的分割

最大流-最小分割问题(Max Flow and Min Cut Problem)_第2张图片

最大流-最小分割问题(Max Flow and Min Cut Problem)_第3张图片

而最小分割问题就是:找到容量最小的一个分割方式。

最大流问题

最大流问题针对的是与最小分割问题中相同设定的有向图,图中的边也是都有一个值为正的容量(capacity)。

我们定义**流(st-flow/flow)**为一系列赋予图中边的值,这些值必须满足要求:

  • 容量限制: 0 ≤ 0\le 0 经过该边的流 ≤ \le 该边的容量
  • 局部均衡:每个顶点的流入(inflow)=流出(outflow)(除了源点s和目标点t)

最大流-最小分割问题(Max Flow and Min Cut Problem)_第4张图片

再定义一个**流的值(The value of a flow)**为目标点t的总流入。

最大流-最小分割问题(Max Flow and Min Cut Problem)_第5张图片

而最大流问题就是:找到值最大的一个流。

事实:最小分割和最大流问题其实是对偶问题。

Ford-Fulkerson算法

Ford-Fulkerson就是解决最大流/最小分割问题的一种算法。

最大流-最小分割问题(Max Flow and Min Cut Problem)_第6张图片

  • 第一步:初始化,以一个值为0的flow开始。

最大流-最小分割问题(Max Flow and Min Cut Problem)_第7张图片

  • 第二步:不断尝试寻找一条增广路径(Agumenting path),即一条从源点s到目标点t的无向路径(即不需要按照有向边的指向走,可以反向走),且满足:

1.可以在某些正向边(Forward Edge)上增加流。(未满)
2.可以在某些反向边(Backward Edge)上减少流。(非空)

几个满足要求的增广路径的例子:

最大流-最小分割问题(Max Flow and Min Cut Problem)_第8张图片

最大流-最小分割问题(Max Flow and Min Cut Problem)_第9张图片

最大流-最小分割问题(Max Flow and Min Cut Problem)_第10张图片

最大流-最小分割问题(Max Flow and Min Cut Problem)_第11张图片

  • 第三步:当所有从s到t的路径都已经是满的正向边或者空的反向边时,结束算法。(不存在任何增广路径了)

最大流-最小分割问题(Max Flow and Min Cut Problem)_第12张图片

这里还存在几个问题:

1.如何得到最小分割?
2.如何找增广路径?
3.如果Ford-Fulkerson算法结束了,它一定总是能找到最大流吗?(算法正确性)
4.FF算法总是能结束吗?如果能结束,大概需要多长时间结束?(时间复杂度)

最大流-最小割理论

最大流和最小分割的关系

我们首先定义**穿越一个分割(A,B)净流(A net flow across a cut (A,B))**为从A到B的边的流的总和,减去从B到A的边的流的总和的差。

最大流-最小分割问题(Max Flow and Min Cut Problem)_第13张图片

  • 流值定理:令f为任意流,(A,B)为任意一个分割,则穿越分割(A,B)的净流等于f的值。

直觉:流守恒。

  • 弱对偶性(Weak Duality)

f的值 ≤ \le (A,B)的容量

最大流-最小分割问题(Max Flow and Min Cut Problem)_第14张图片

增广路径定理

如果流f状态下,不存在任何的增广路径,则流f为最大流。(解决问题3)

最大流-最小分割定理

最大流的值=最小分割的容量(解决问题1)


时间复杂度分析

回到我们上上部分提到的四个问题:

1.如何得到最小分割? - 找到最大流的值,也就找到了最小分割的容量。
2.如何找到增广路径? - BFS广度优先搜索就可以。
3.如果Ford-Fulkerson算法结束了,它一定总是能找到最大流吗?(算法正确性) - 是的
4.FF算法总是能结束吗?如果能结束,大概需要多长时间结束?(时间复杂度) - 如果边的容量都为整数情况下能保证结束,时间分析我们接下来看。

FF算法容易碰到的坏情况

即使当边的容量均为整数,增广路径的数目可能和最大流的值一样大,这会造成算法效率低。

最大流-最小分割问题(Max Flow and Min Cut Problem)_第15张图片
最大流-最小分割问题(Max Flow and Min Cut Problem)_第16张图片
最大流-最小分割问题(Max Flow and Min Cut Problem)_第17张图片
最大流-最小分割问题(Max Flow and Min Cut Problem)_第18张图片
最大流-最小分割问题(Max Flow and Min Cut Problem)_第19张图片
最大流-最小分割问题(Max Flow and Min Cut Problem)_第20张图片

不过这种情况可以轻易避免。(优先寻找最短/最宽增广路径)

最大流-最小分割问题(Max Flow and Min Cut Problem)_第21张图片

最大流-最小分割问题(Max Flow and Min Cut Problem)_第22张图片

延伸:规约

对于两类问题A和B:“A ≤ \le B”

则我们若能解决B问题,也一定能解决A问题。即解决B和解决A问题一样难。

用在最大流问题里,就是配对问题(Bipartite Matching) ≤ \le 最大流问题 ≤ \le 线性规划。

最大流-最小分割问题(Max Flow and Min Cut Problem)_第23张图片

参考文献

[1] Introduction to Algorithms: Third Edition, Thomas et al.

你可能感兴趣的:(Algorithm,and,Data,Structure)