zoukankan      html  css  js  c++  java
  • 网络流问题的思考

    首先要利用网络流去给题目设计算法,就要满足网络流的基本要求:

        —容量限制

        —流守恒性

        —反对称性

      —上面三个性质可以在正流和净流上定义,这样定义的结果就是,

             既可以满足一些限制(容量限制可以具体为别的限制),

             又可以使得有“流”的结果。进出是一样的,还可以在后面讨论最大的结果。

    流的简单性质:点组的性质

        —f(X,X) = 0;

        —f(X,Y) = -f(Y,X);

        —f(X或Y,Z) = 和,但是需要X,Y不相交;

    最大流最小割定理

      —三条性质保证定理

        —流网络的割:

          —任意流和在这个流下定义的一个割(源点和汇点必须分属两个分区)流是一样的。

           —|f| = f(S, T);

          —最大流的上限是割容量

           —|f| <= c(S, T);

        —残留网络:

         —关于计算残留网络容量,对称边内的流在本条边的流变负流,使得本条边容量变大

          —对于这个算法的解释是:先抵消反向的流,然后再填充这边奔来的残留网络容量

         —残留网络的边和原图边的关系

          —f(u,v) < c(u,v)  =>  (u,v), (v,u) 都存在

          —f(u,v) = c(u,v) 且不为0  => (u,v)不存在,(v,u)存在

          —c(u,v) = c(v,u)  =>  都不存在

          ——(u,v)在残留网络中存在,则需要(u,v)或者(v,u)在原图中存在,|Ef| <= 2|E|

         —流可以顺序叠加:f是G的一个流,f'是Gf的一个流,那么|f+f'| = |f| + |f'|

        —增广路径:

         —寻找增广路径:广度优先,深度优先

         —找路径,相应流,叠加流

      —最大流最小割定理

        —三条等价命题

        —命题给设计算法的启示

         —一个最大流是任意割的容量

         —最大流等价残留网络不存在增广路径

    最大流算法分析

      —详情看下面博文

       —http://blog.csdn.net/abcjennifer/article/details/5556455

      —基础算法:Ford - Fulkerson 方法

        1 Ford-Fulkerson 方法 (G,s,t)
        2 将各边上流量 f 初始化为 0
        3 while 存在一条增广路径 p
        4     do 沿路径 p 增广流量 f
        5 return f

        —这个算法只是利用最大流最小割的一个思想

      —广度优先寻找增广路径:Edmonds - Karp 算法    

        1 Shortest Augmenting Path
        2  x <-- 0
        3  while 在残量网络 Gx 中存在增广路 s ~> t
        4      do 找一条最短的增广路径 P
        5         delta <-- min{rij:(i,j) 属于 P}
        6         沿 P 增广 delta 大小的流量
        7         更新残量网络 Gx
        8  return x

        —虽然使用BFS使得复杂度限制在O(VE2),但是由于每次寻找增广路径都是一个BFS的过程,

         需要搜索预最短路径之前的所有路径,这样频繁的BFS使得算法由很多冗余

      —同时运用DFS和BFS查找增广路径并且计算最大流:Dinic 算法

       —算法过程:

        —先进行一遍BFS标记所有点的深度d[i]

        —保留d[i]+1 = d[j]的边

         —这样由于d[i]是每个点从源点到i的最短距离,保留这样的边使得,每条路径都是源点到该点的最短路径

        —DFS遍历所有到汇点t的最短路径,使用F-F的思想求得最大流

        —重复

       —网上一个人的对算法的理解:http://blog.csdn.net/zxy_snow/article/details/6176628

    网络流题目

      —PIGS poj-1149

        —http://www.cnblogs.com/sleeper-qp/archive/2012/07/23/2605253.html

        —构图在“算分”文件夹下pdf里

      —Alice's Chance poj-1698

        —在POJ文件夹里面有代码

        —最大流题目的解题过程

         —构图:

          —关键是每周的周一到周日都有一套结点:

           否则,按三部图的话,无法判定某天day的工作是来自哪部film,而且也不知道每周到源点应该容量多大

          —不能在同一天干两部电影:天的顶点流出的边的容量要设置成1,这样在左边只能选择一个电影流入

          —最大流为电影需要天数的总和

          ——各自为一套的题目:

           —周-天:本身固有7条边,而且每天进入周的流量其实有区分的(这题中,电影不同)

         —最大流算法:一般用Dinic算法

          —外层循环是BFS,标记深度

          —由标记和新图DFS,循环当前图的所有可增广路径,然后更新流

      —Optimal Miking poj-2112

        —构图:

         —Floyd求任意点最短路径

         —按二分法设定最远点的最近距离,构建流图:机器和奶牛之间的连线

          —源点和机器之间连接M容量的边

          —奶牛和汇点连接容量为1的边

        —最大流算法

          —得到奶牛数量大小的流量

          —EK算法:每次流量加1,多一头牛可以找到机器

          

  • 相关阅读:
    企业微信中如何屏蔽另外一个企业的消息
    国际商标注册里面的头头道道
    如何使用charles,常见的charles功能
    Win8中GridVIew千变万化——绑定分组数据
    Win8中ListBox的ScrollIntoView方法失效
    一起零基础通过Nosql考试~~
    Ubuntu部署ros小龟爬爬实例
    学习算法是件怎样的事
    Centos7配置Python3.10.1
    基于Centos7、PHP7.4环境部署wordpress
  • 原文地址:https://www.cnblogs.com/siyudemo/p/3125990.html
Copyright © 2011-2022 走看看