「学习笔记」模拟费用流

发布时间 2023-05-06 19:40:18作者: came11ia

学习自 cmd 老师的博客


昨天学习了模拟费用流相关内容阿。

常见的模拟费用流题大概会长成一个类似匹配的形状。主要的方法大概是两种:“增量-费用任意流” 模型或是直接模拟 EK 算法的增广过程。

“增量-费用任意流” 模型,即每次在图中增加一些点和边,求新的费用任意流。要注意,如果使用这种方法,那么每次除了讨论 \(S\)\(T\) 的负路径之外,还需要考虑负环。注意到这里负环不可能长成 \(S \to T \to S\) 的形状,因此每个负环的含义是一组匹配中的某一项元素发生了替换。把所有负路径和负环的含义写出来,然后使用堆等数据结构维护。

直接模拟 EK 算法的增广过程,即从整体考虑,每次找到 \(S \to T\) 的最短路并更新状态,过程可能需要各种数据结构维护。注意在非增量费用流中,和 \(S\)\(T\) 相连的边不会退流,也不存在负环,每条增广路的含义是添加一对元素,然后可能和原来已经配对好的元素进行替换。因此另一种方式是,把所有增广路的含义写出来,然后使用堆等数据结构维护。

注意以下类型的题可能暗示该用哪种做法:

  • 限制了流量 \(k\),那么很可能是需要模拟 \(k\) 次增广。当然也可能根据凸性 WQS 二分,然后用 “增量-费用任意流” 模型,但复杂度较高。
  • 带修改,那么肯定是 “增量-费用任意流” 模型。但注意,如果要求每次加元素,然后求所有元素都被匹配的答案,由于必定满流,和 \(S\) 相连的边不会退流,不会产生反向边。因此不存在新的环,于是只需考虑新增的源汇路。

不管是哪种方法,在具体的问题中很可能都还需要分析图或者匹配本身的性质。因为我既不懂费用流也不懂贪心,就不乱说话了。

上面的论述不保证是对的。其实还是要具体问题具体分析,具体的例子详见 cmd 老师的博客,懒得写了。就这样好了。