算法: 最大流与最小割

作者: 写代码的海怪 | 来源:发表于2019-03-06 00:29 被阅读48次

什么是最大流

最大流要解决的问题是从 S 到 T 怎么才能最大地将数据运到另一边。这个“数据”可以是水,或者网络数据包。举个例子

在上面这个图中将数据从 S 运到 T,其中边的权值称为 Capacity 即,在这条边中流动的数据不能超过 Capacity 值,flow \leq capacity

这个图很简单,我们很容易就看出来最大流是 5。流动方向为

  1. S - 1 - T: 2
  2. S - 1 - 2 - T: 1
  3. S - 2 - T: 2

那最小割是啥?就是一堆边的集合,这些边权重加起来应该是要等于最大流的值,且这些边都是从 S 那边到 T 这边的。

简单思路

我们先来大概想个方法去找最大流。其实找最大流的简单方法就是一条路一条路试呗,刚好试到上面三条路就发现是最大的了。

但是总有不如意的时候,比如我们先走 S - 1 - 2 - T,用了流 3,那么整个网络可以再尝试的路只剩下这些了:

现在我们就陷入僵局了,没路可以尝试了,最大流就变成了 3,明显错了。正确的做法应该是这次没找到好的可以进行“反悔”操作,回退上一步之类的,然后再去尝试找最大流嘛。这就需要用到残余网络了。

残余网络

残余网络也叫做 Residual Network,它的出现可以使得我们每次找路的时候进行 “反悔” 操作。比如上面走了 S - 1 - 2 - T 后,残余网络是这样的

可以看到正向走了多少,那么就画一条反向边,这条边的权值就等于前面走了多少流。因为现在有边 2 -> 1 了,所以可以找到一条路 S - 2 - 1 - T,用了流 2,再加上前面找的 3,所以最大流是 5。

这就做完了,其中最小割就是集合 {S - 1, S - 2}: 5。这里所找的路叫做 Augmenting path,反正就是 path,不用去管前面那个是什么意思。

Ford-Fulkerson 算法

画图好画,那程序上怎么实现呢?其实程序上我觉得更容易。伪代码如下

  • 首先初始化 Residual Network G
  • 使用 DFS 或者 BFS 去找 Augmenting Path,找到一个就加入到 Residual Network G
  • 因为使用了之后边是反过来的,所以总会出现 S 走不到 T 的时候,那个时候就停止算法即可

相关文章

  • 算法: 最大流与最小割

    什么是最大流 最大流要解决的问题是从 S 到 T 怎么才能最大地将数据运到另一边。这个“数据”可以是水,或者网络数...

  • R 数据可视化 —— igraph 函数应用

    前言 igraph 提供了许多图论算法,例如我们熟知的最短路径、最大流最小割、最小生成树等。 我们针对下面的图,介...

  • 最大流, 最小割问题及算法实现

    本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致...

  • lemon 代码分析之文本解析

     lemon主要用于处理图论相关的算法,最短路径,最大流最小割。lemon代码库中大量使用模板,c++语言的bla...

  • 网络流

    最大流与最小割 POJ 3713: Transferring Sylla网络流暴力做法:枚举起点终点作为源点和汇点...

  • 分布式存储系统的分容灾块数据分布算法

    本算法是基于最小费用最大流算法建模,读者需要对最小费用最大流算法有一定的基础,要能理解这个例题 http://ww...

  • 算法设计与分析笔记之最大流/最小割问题

    割(Cut) s-t cut:(A, B),将图分为两部分A和B,源s∈A,终点t∈Bcut(A, B)的容量(c...

  • 图割-最大流最小切割的最直白解读

    导读: 本文主要针对图像分割中提及的图割算法作一个最直白的介绍,面向的读者是所有对这个方面感兴趣的同学。从目标上来...

  • BGL(boost graph Library)(8-)

    ch8介绍算法:搜索:bfs/dfs;最小生成树:最短路,网络流,最小割;ch9属性映射,样例为dij算法的rel...

  • 最短路算法

    与最小生成树有些不一样.在这里提出三种算法.dijkstra算法,是最普通也是最简单的.与prim算法有些类似,但...

网友评论

    本文标题:算法: 最大流与最小割

    本文链接:https://www.haomeiwen.com/subject/kpguuqtx.html