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

    引言

    http://blog.csdn.net/yiqingnian28/article/details/23388633 

    还是前几天参加的2014阿里巴巴春季校招(测试开发岗)笔试. 有道选择题:

      图1中标出了每条有向公路最大流量,请问从S到T最大流量是( ). 

        A.46     B. 47     C. 54      D.77

     

                           图一 网络流

    看到这一题的时候我非常懊悔, 因为最大流的算法记得看过, 却没复习到. 现在把它整理出来, 亡羊补牢.

    接下来会先列出来相关的定义和定理. 精力有限, 只做罗列, 见谅! 

    然后给出这题的解题过程.

    相关定义

    流网络  

    流网络G=(V, E)是一个有向图, 图中每条边(u, v)∈E有一个非负的容量值c(u, v) ≥0. 并且对于(u, v)不存在反向边(v, u). 如果E中不存在(u, v), 则c(u, v)=0. 图1就是一个流网络.

     

    G中的流是一个实值函数f: V×V→R, 满足容量限制, 即f(u, v)≤c(u, v)和流量守恒性质, 即对于除S和T外的点满足流入与流出相等. 如图2所示.

                           图2:流

    残存网络  

    直观上说,给定G和f, 残存网络Gf就是由那些仍有空间对流量进行增加的边构成. 在流网络中, 若某条边的流量小于其容量, 则将其加入的Gf中; 若某条边流量等于其容量, 则这条边将不属于Gf

    残存容量  

    cf(u, v)的取值满足: 若(u, v)∈E, 则取c(u, v)-f(u, v)0; 若(v, u) ∈E, 则取f(v, u); 其他情况取0. 流和流对应的残存网络如图3所示.

                                                     图3: 流和流对应的残存网络

    增广路径  

    增广路径p是残存网络Gf中一条从源节点S到汇点T的简单路径. 图4中加粗阴影所示的即是一条增广路径.

                                                                图4: 增广路径

    最大流最小切割定理

    设f是流网络G=(V, E)中的一个流, 源点为S, 汇点为T. 则下述条件是等价的:

    (1) f是G的一个最大流.

    (2) 残存网络Gf部包含任何增广路径.

    (3) f的值等于G中某个切割的容量(本例中不涉及, 详情请自行百度).

    Ford-Fulkerson算法

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. FORD_FULKERSON(G, s, t){  
    2.     for each edge(u, v) ∈G.E  
    3.         (u, v).f = 0  
    4.     while Gf中存在一条s到t的增广路径p{  
    5.         cf(p) = min{cf(u, v): (u, v) is in p}  
    6.         for each edge(u, v) in p{  
    7.             if (u, v)∈E {  
    8.                     (u, v).f += cf(p)  
    9.             } else {   
    10.                     (v, u).f -= cf(p)  
    11. }   }   }   }  

    Edmonds-Karp算法

    查找增广路径可以用Edmonds-Karp算法选择从S到T的最短路径, 其中每条边的权重都为1. 也就是说以S为出发点广度优先遍历(BFS)图G, 到达T即终止.

    解题过程

    整个过程如图5所示. 图中边上的数字的含义是, f/c表示该边容量为c, 流量为f; 而单个数字c则表示容量为c, 流量为0.

                                                              图5 解题过程

    图5中, 当到达(j)时已经找不到增广路径了, 则(i)中所示的流即为该流网络的最大流, 而流量则是流进T的流量总和, 即15+31=46. 故选A.

  • 相关阅读:
    eclipse从接口快速跳转到实现类
    eclipse中mybatis的xml配置文件代码提示
    eclipse安装mybatis的插件
    eclipse修改默认的代码注释
    eclipse输入时自动提示
    eclipse中lombok注解不生效
    eclipse创建springboot项目
    家庭记事本(终)
    家庭记事本(6)
    人月神话(二)
  • 原文地址:https://www.cnblogs.com/aabbcc/p/6247837.html
Copyright © 2011-2022 走看看