zoukankan      html  css  js  c++  java
  • 算法学习——上下界网络流

    顾名思义,带上下限网络流即对于网络流中的每一条边,都带有流量的上界和下界。

    普通的网络流可以看做下界为0的上下限网络流。

     

    1,无源汇带上下界可行流。

    定义一个数组d[x]表示图中点x的入度下限和-出度下限和。

    建图方式为:
      对于图中每一条边,都连流量为上界-下界的边,并在加边的时候统计d[x]。

      对于任意一个点,如果它的d[x] > 0,那么连s --- > x, 流量为d[x];

      如果它的d[x] < 0, 那么连x --- > t, 流浪为-d[x]。

      然后直接从s到t跑网络流即可,如果满流即为合法,否则不合法。

      如何理解?

      因为下界是必须达到的,因此先把所有的边都强行达到下界。

      对于任意一个点,如果d[x] > 0, 那么表示进来的流量有剩余,还没有流完,因此从s给它补充d[x]的流量。

      反之,如果d[x] < 0, 那么表示进来的流量不够,所以连向t以让它可以接收流量来补足不够的-d[x]的流量。

      如果满流,那么代表剩余的流量可以恰好补全不够的流量,那么就是可行了。

      同时因为每条边都变为了上界-下界,因此不管怎么流,都是不会超过上界的,于是就成功的把流量限制在了[下界,上界].

    2,有源汇带上下界可行流。

      建图方式与上述相同,只是把原来的源汇连一条t --- > s : inf的边(现在的超级源汇为ss, tt)

    3,有源汇带上下界最大流。

      先做一遍可行流,然后去掉ss和tt,在残余网络上跑最大流,最大流即为答案。

      因为有反向边,所以之前可行流流出的流量会从反向边流到t,于是基础流量就会被满足了,然后就是在这个基础上增添流量。

      又因为是最大流,所以跑出来的肯定是最优解。

    4,有源汇带上下界费用流

      建图方式和网络流差不多,原图上的边费用不变,新增的边费用为0.一开始减掉下界的时候要加上流下界的费用。

      最后和跑出的费用相加,得到最后的费用。

      

  • 相关阅读:
    centos7 挂载未分配的硬盘空间 (测试可用)
    虚拟化下Centos7 扩容根分区
    Centos7 虚拟机挂载未分配的空间
    Linux下对LVM逻辑卷分区大小调整 [针对xfs和ext4文件系统]
    XFS vs EXT4
    虚拟化下Centos7 扩容根分区
    centos7下扩展根分区(图文详解)
    解决删除镜像时image is referenced in multiple repositories
    linux 根目录扩容方法
    Linux系统扩容根目录磁盘空间的操作方法
  • 原文地址:https://www.cnblogs.com/ww3113306/p/9688842.html
Copyright © 2011-2022 走看看