网络流问题
网络流问题是一类网络优化问题,如:在网络传输中传输尽可能多的数据包,交通运输中在道路限制单位时间内的卡车数量的情况下,尽可能多地发出卡车,最小化代价的情况下断开从某地到另一地点的连接。
背景设置
给定有向图G(V,E),V是点的集合,E是边的集合,每一条边e的最大流量(capacity)非负(c(e)>0)。图中给定两个特殊的节点,源节点s和汇聚节点t(s!=t)。如下图。
问题设置
在两个约束条件下最大化s到t的总流量:
(1)边e的流量不超过c(e);
(2)对于s,t以外的节点,流入等于流出。
求最大流
Ford-Fulkerson Algorithm算法:
我们把从源点s到汇聚点t的一条路径(s->v0->v1->...->t)称为增广路径,把点和点之间的有向边看作有向管道,这个算法的基本思想是迭代地找到一条s到t的增广路径,给这条路径的管道中加流量,这个流量是我们找到的增广路径中的最小管道容量值,管道满则意味着不能再向这个管道中加流,重复这样的动作,直到找不到从s到t的增广路径,那么此时从s到t的流量,就是最大流。算法详细如下:
(1)残留网络
流量f经过节点u->v,则
c(u->v)=c(u->v)-f
c(v->u)=c(v->u)+f
(向两个相反方向发送流等于抵消流)。
(2)算法流程
算法伪代码如下:
Set ftotal=0
Repeat until there is no path from s to t:
Run DFS from s to find a flow path to t
Let f be the minimum capacity value on the path
Add f to ftotal
For each edge u → v on the path:
Decrease c(u → v) by f
Increase c(v → u) by f
(3)算法图解
(a)找到第一条增广路径,路径中的最小流量值为12,更新图
(b)第二条增广路径,路径中的最小流量为7,更新图
(c)第三条增广路径,路径中的最小流量为4,更新图
经过三次迭代之后,我们可以看到,图中再找不到增广路径了,此时图中的流量为最大流,即23。
求最小割
割其实就是一组边的集合,将这组边从图中去掉之后,就可以将两个点之间的前向通路断开,这两个点之间可能会有多个点。最小割即代价最小的割。
有定理:最大流=最小割,可以简单理解:1.最大流不可能大于最小割,因为最大流所有的水流都一定经过最小割那些割边,流过的水流怎么可能比水管容量还大呢? 2.最大流不可能小于最小割,如果小,那么说明水管容量没有物尽其用,可以继续加大水流。
以下图为例,可以看到,边a->b,d->b,d->t的剩余流量为0,则认为他们之间没有通路,也就是说,s,a,c,d和b,t被分成了两部分,图中不存在从s到t的通路(这里的通路指的仅仅是前向通路),因此a->b,d->b,d->t为下图的最小割。
参考文章:
[1]最大流问题与Ford-Fulkerson算法介绍
[2]standford-cs97si-slides
[3]图像分割之最小割与最大流算法