算法学习——上下界网络流

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

普通的网络流可以看做下界为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.一开始减掉下界的时候要加上流下界的费用。

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

  

posted @ 2018-09-25 01:12  ww3113306  阅读(229)  评论(0编辑  收藏  举报
知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。