• [模板] 上下界网络流


    上下界

    上下界网络流指的是边的流量有上下界的一类网络流问题.

    网络流

    无源汇可行流

    无源汇显然没有最大流:P

    对于边 ((u, v, [l, r])), 连边 ((u, v, r-l)), 并且记录 (v_u += l), (v_v -= l).

    然后, 建立超级源点(ss), (tt). 对于 (v_p > 0) 的点, 连边 ((p, tt, v_p)); (v_p < 0) 的点, 连边 ((ss, p, -v_p)).

    然后跑 ((ss, tt)) 的最大流, 当且仅当 (ss) 的所有出边都满流是有解, 且每条边 (e) 的真实流量为反向边的流量 (+ l_e).

    事实上, 最终得到的可行流为原图中的若干个环 (复杂环).

    有源汇可行流

    注意到源点 (s) 和汇点 (t) 流量并不守恒.

    因此, 连边 ((t, s, +infty)). 然后问题就变成无源汇的可行流了.

    有源汇最大流

    根据有源汇可行流的方式建图;

    先跑 ((ss, tt)) 的最大流, 然后再跑 ((s, t)) (而不是 ((ss, tt))) 的最大流, 第二个流量即为答案.

    有源汇最小流

    根据有源汇可行流的方式建图;

    先跑 ((ss, tt)) 的最大流, 记 ((t,s)) 的真实流量 (即为反向边流量) 为 (f_0);

    然后删掉 ((t,s)) 及其反向边 (否则 (f_1) 会变为 (+infty)), 再跑 ((t, s)) 的最大流, 记流量为 (f_1), 最小流即为 (f_0 - f_1).

    费用流

    最小费用可行流

    先提一下这个...

    利用spfa不断找最短路增广, 直到找到的最短路长度为正或找不到, 得到的即为最小费用可行流.

    边的处理

    对于边 ((u, v, [l, r], cost)), 连边 ((u, v, r-l, cost)), 并在答案中加上 (l cdot cost); 记录 (v_u += l), (v_v -= l).

    然后, 建立超级源点(ss), (tt). 对于 (v_p > 0) 的点, 连边 ((p, tt, v_p, 0)); (v_p < 0) 的点, 连边 ((ss, p, -v_p, 0)).

    和无费用的流基本相同. 事实上, 最大流可以看做一个费用为0的最小费用最大流.

    另一种建法: 对于边 ((u, v, [l, r], cost)), 连边 ((u, v, r-l, cost)), ((ss, v, l, cost)), ((u, tt, l, 0)).

    无/有源汇的可行/最大/最小费用流

    和不带费用的版本几乎完全相同, 把边的处理方法换成上面的即可.

    负权边的处理

    回忆我们是如何处理上下界的流量限制的:

    1. 假设这条边流量为流量下界;
    2. 发现这时一些点不满足流量平衡限制, 然后通过附加源点和流量的方式满足每个节点流量平衡.

    假设边的流量范围为 ([l, r]), 那么这时我们假设的流量为 (l). 事实上, 流量只要为 ([l, r]) 内的任意实数, 都能得到正确的可行流. 当流量过大时, 由于反向边 (反悔边) 的存在, 可以把流量缩小到正确的答案.

    现在考虑一条负权边 ((u, v, [0,f], -c)), 其中 (c > 0).

    我们直接将这条边的流量设为 (f), 也即建立 ((u, v, 0, -c)), 和反悔边 ((v, u, f, c)). 那么, 这条负权边就变成了反向的正权边.

    更进一步的, 我们可以消去图中所有的负权边以及负环. 这可以保证SPFA一定能得到正确答案.

    参考资料

  • 相关阅读:
    是时候把邮件发送时间机动化处理了
    GDUT 初赛 01串也疯狂之光棍也有伴
    通达OA 尝试一下进行通达OA的培训
    不让政府系统用Windows 8,他们用什么?
    Mybatis自动生成插件对数据库类型为text的处理
    Mybatis自动生成插件对数据库类型为text的处理
    js的同步与异步
    js的同步与异步
    js的同步与异步
    Java中的数组与集合
  • 原文地址:https://www.cnblogs.com/ubospica/p/10539419.html
Copyright © 2020-2023  润新知