zoukankan      html  css  js  c++  java
  • 最大流最小割算法

    网络流问题

    网络流问题是一类网络优化问题,如:在网络传输中传输尽可能多的数据包,交通运输中在道路限制单位时间内的卡车数量的情况下,尽可能多地发出卡车,最小化代价的情况下断开从某地到另一地点的连接。

    背景设置

    给定有向图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]图像分割之最小割与最大流算法

  • 相关阅读:
    hdu 2001 计算两点的距离
    hdu 2001 计算两点的距离
    hdu 2000 ASCII码排序(c语言)
    hdu 2000 ASCII码排序(c语言)
    1.网页学习-开始学习第一步:
    .net 父窗口线程交给子窗口
    多线程传递多个参数
    not Exists的使用方法
    xml.dom.minidom介绍
    .net之线程控件之间访问
  • 原文地址:https://www.cnblogs.com/helloworldToDu/p/14245407.html
Copyright © 2011-2022 走看看