题解 CF708D 【Incorrect Flow】
这是一个有源汇带上下界最小费用可行流的问题,然而这个“带上下界”其实是假的。
注意到,只要
对
- 如果
f \le c ,则最终的f' 可以减小或增大,故连如下三条边:- 减小
f :也就是从v 到u 退流,连v \to u ,容量为f ,费用为1 。 - 增大
f (f \le c 的部分):连u \to v ,容量为(c - f) ,费用为1 。 - 增大
f (f > c 的部分):连u \to v ,容量为\infty ,费用为2 。
- 减小
- 如果
f > c ,则至少要花费(f - c) 的代价,且在c \le f' \le f 时取到,故先贡献(f - c) ,连如下三条边:- 减小
f ,最终的f' 在c \sim f 之间:连v \to u ,容量为(f - c) ,费用为0 。 - 减小
f ,最终的f' \le c :连v \to u ,容量为c ,费用为1 。 - 增大
f :连u \to v ,容量为\infty ,费用为2 。
- 减小
然后对于初始的每条边,连
实际上,因为本题中的上下界把“有源汇带上下界可行流”转化成普通最大流,就是:
新建超级源和超级汇
如果
如果
最后,为了取消原来的源汇,新建一条
然后跑一次超级源到超级汇的最小费用最大流,一定是满流的,转化回原图就是一个最小费用可行流了。
如果使用 SPFA 辅助实现的类 Dinic 算法求最小费用最大流,时间复杂度为
时间复杂度为