算法学习——上下界网络流
顾名思义,带上下限网络流即对于网络流中的每一条边,都带有流量的上界和下界。
普通的网络流可以看做下界为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.一开始减掉下界的时候要加上流下界的费用。
最后和跑出的费用相加,得到最后的费用。