[Note] 网络流建模再探
[Note] 网络流建模再探
Part 1. 上下界费用流与普通费用流模型
这部分基础的知识不会详细说明,因为已经有很多资料说明了,如有疑惑,参见其他资料,如 算法学习笔记(60): 上下界网络流 - 知乎 Pecco。以下采用和该资料里一样的术语。
差网络:边容量下界为 0,上界为原网络上界与下界之差的网络
超级源点/汇点:不同于原网络源点的另一个源点(如果存在),本文总是用 \(S'\) 表示。类似地用 \(T'\) 表示超级汇点。以与原网络的源汇区分(这二者采用 \(S,T\) 来表示)
\(A\xrightarrow{[l,r],c}B\) 表示有上下界 \([l,r]\) 容量限制的,费用为 \(c\) 的边。
1.1 无源汇有上下界可行流
除了预流推进类,大部分的网络流算法通过寻找“增广路”来将当前状态转移到一个更优的状态,而退流机制可以调整之前的决策,实现反悔。无源汇有上下界可行流是一个循环流,流量在网络中是循环的,我们为了达到每条边的流量下界,往往采用强制满流的思路,先把每条边的流量都设为下界,但是这可能导致流入流出的不平衡。
例如有点 \(x\) 流入大于流出,那么我们在差网络上建立超级源点 \(S'\),从 \(S'\to x\) 建边补流。这相当于要求 \(x\) 在差网络上额外输出一些流量来抵消原先的不平衡。由于每个点都进行这种补流操作,所以最终给 \(S',T'\) 补的边的总容量应该相等。
然后运行最大流 \(S'\to T'\),若求出最大流之后满流则说明存在可行流。
1.2 有源汇有上下界可行流
我们通过 1.1 求出了一个可行的循环流,我们考虑连接 \(T\xrightarrow{\inf}S\),这样就变成循环流了,然后这条边的反边流量就是求出的有源汇有上下界可行流的具体值。
1.3 有源汇有上下界最大流
我们通过 1.2 并没有求出最大流,我们在 1.2 运行的最大流只是保证各附加边满流,求出了 \(S'\to T'\) 的最大流(显然是加入的附加边的总容量),但是不一定是 \(S\to T\) 的最大流。我们删除所有附加边以及 \(T\xrightarrow{\inf}S\),然后运行 \(S\to T\) 的最大流即可进一步增广,耗尽 \(S\to T\) 的增广路。
1.4 有/无源汇有上下界最小费用可行流
依然是强制满流法。
我们先像 1.1 一样进行强制满流并处理源汇点(假如有),然后加入附加边,运行 \(S'\to T'\) 的最小费用最大流算法。这里最大流只是保证附加边满流,对其他边是没有更多限制的,因此不一定求出来原图的最小费用最大流,只是最小费用可行流。
1.5 拆边法
以无源汇上下界最小费用可行流为例,与 1.4.1 大同小异,将一条 \(u\xrightarrow{[l,r],c}v\) 拆成 \(S'\xrightarrow{l,0}v,u\xrightarrow{l,c}T',u\xrightarrow{r-l,c}v\),然后运行 \(S'\to T'\) 的最小费用最大流算法。这个东西其实就是省略了你手动计算附加边的过程,直接加上了,同理可做上面所有的问题。
当这条边流过 \(l\) 的流量时,相当于 \(u\) 失去 \(l\) 的流量,\(v\) 得到 \(l\) 的流量,所以 \(l\) 的流量先到 \(u\) 然后付费再到 \(v\),就变成了 \(l\) 的流量到 \(u\) 之后直接付完费就到达汇点,然后有新的 \(l\) 流量从 \(v\) 进入网络,最后必须检查所有拆开的边都流完,否则无解,其实跟强制满流法加的附加边是一样的。
1.6 有源汇有上下界最小费用最大流
我们像 1.4 一样先求出最小费用可行流,然后删除附加边并运行 \(S\to T\) 的最小费用最大流算法,就像 1.3 一样。
1.7 P1251 餐巾计划问题 / P4553 80人环游世界
这两道题都可以直接拿上下界最小费用可行流来刻画,但是为什么题解区里面用了普通的费用流呢?难不成他们是一样的?
没错,这两道题通过普通费用流建出来的边和上述 1.5 拆边法建出的边是差不多的。但是
Part 2. 匹配问题
以 P3355 骑士共存问题、P5030 长脖子鹿放置与 P4003 无限之环为例,这一类问题有若干对象的不同选择,不同选择之间互有限制,比如两个选择不能共存(P3355,P5030),或者两个状态必须同时选(P4003),前者容易被建模为最小割,而后者可通过最大流的最大性限制来实现,但是无论如何,都需要一种方法把对象分成两类,以实现最小割,或避免两个对象互相贡献流量而串流。在网格图上,常常用黑白交替染色的技巧来分类。
以 P4003 无限之环为例,没有接头漏水,可以转化为接头匹配,并用流量去限制,但是如果两半都在贡献流量,会发现根本没法建模。这个时候用黑白染色的方法,黑色连接源点,白色连接汇点即可避免。
本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/18878852

浙公网安备 33010602011771号