zoukankan      html  css  js  c++  java
  • 自己对有上下界的网络流的理解


        首先说一下,什么是上下流,上下流也就是有上下界的网络流,正常的网络流都是只有上界,没有下界,但是当有下界限制的时候就可能出现因不能满足所有下界而无解的情况,这种问题一般分为三种问法,有源/无源可行流判断,有源最大流,有源最小流,首先先说下怎么处理上下界,首先对于一条边 from to min max,我们可以把他拆成两个部分,第一部分就是 from->to max-min ,max - min是除了限制以外可以自由流动的流量,我们可以简单的叫他自由边,然后第二部分有两部分组成,首先虚拟超级源点ss,超级汇点tt,然后建边from -> tt min 和 ss -> ss min,这么建边的原因是在流中,任何点的入流量都必须等于出流量,对于这两条边是必须流满的,所以叫必须边,如果有一条边没有流满,那么就是没有可行解。因为最后所有的点必须满足入流等于出流。

     (1)有源/无源可行流判断
            这个是最基础的,无论哪种问法都必须要先判断是否可行,对于有源的,我们可以直接建立一条边t -> s 0 inf ,这样就把有源变成了无源,对于无源的可行流判断,我们只要按照上面的建边拆边方式建图之后,跑一遍ss到tt的最大流,如果所有必须边都满流,那么就是有解,否则无解,如果要输出答案,在残余网络中找到非必须边,非必须边的流量加上该边的下限就行了(因为下限已经满流).

     (2)有源最大流
            首先要做(1)那样的处理,如果判断有解了,s,t之间的流量,尤其是自由边的流量有可能没有用完,我们直接在残余网络上跑一遍s,t的最大流,最后答案就是当前的这个流量+所有的下限。


     (3)有源最小流

           这个比较特别,我还没有见过这样的题目,可以分三个步骤处理
          (1)先不加t->s,跑一遍 ss -> tt的最大流记为f1,目的是为了让所有的必须边都尽可能的满流。
          (2) 然后直接在残余网络上添加 t->s 0 inf 的边,把当前的边记为w
          (3) 然后在跑一遍 ss -> tt的最大流,记为f2
       

     如果所有的必须边都满流了,那么w这条边的流量就是s的入流量,也是出流量,也是s流出去的最小流。至于为什么,其实我也不是很清楚,但我现在唯一的理解就是,一开始不建t->s是为了尽可能的不浪费s的出流量(因为不建,入流量就是0),保存实力,跑一遍之后,把用到的别人的力量全都用完了,然后在t->s,然后在跑一遍,这样应该是s所流出的东西是尽可能最小的了吧,又因为 入=出,所以s流出的等于w的流量,等于s到t的最最小流。








     












  • 相关阅读:
    Git push 出现 refusing to merge unrelated histories
    The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.
    Linux离线安装docker&docker-compose
    mybatis新增记录使用 useGeneratedKeys无法返回主键
    Docker 修改容器内的时区
    快排写法
    c++学生信息管理系统(window控制台实现鼠标点击操作)
    洛谷P1006 传纸条(多维DP)
    二维bit模板
    一个milller_rabin模板
  • 原文地址:https://www.cnblogs.com/csnd/p/12062857.html
Copyright © 2011-2022 走看看