网络流题单

AGC031E Snuke the Phantom Thief

解法 1

核心思想:一类把前后缀限制转化为对单点限制的优化。

比如我们做范德蒙德卷积时,需要计算 \(\sum_{i = 1}^{\inf} {n \choose i}{m \choose k - i}\)。但如果是 \(\sum_{i = 1}^{x} {n \choose i}{m \choose k - i}\),我们就不能直接套用公式。这时候可以思考组合意义:\(n + m\) 个小球,选出 \(k\) 个,要求前 \(n\) 个小球里最多只能选 \(x\) 个。这时候我们换一种角度,把限制转化为第 \(x + 1\) 个小球的位置一定要在 \(n\) 之后。这样变量从下面换到了上面,可能会适合某些题目的要求。

这个题也有类似的做法:要选的宝石个数 \(k\) 固定时,本题限制就可以转化为对某些宝石坐标大小的限制,开 \(2k\) 个点表示第 \(1, 2, 3, \dots, k\)\(x\) 坐标以及 \(y\) 坐标,每个坐标已经有了范围的限制,可以网络流解决。

解法 2(我的解法)

核心思想:四边形不等式优化匹配。

考虑一个问题:有 \(n\) 个红色点和 \(n\) 个蓝色点在数轴上,我们要放 \(n\) 个白色点。每放一个白色点,都要选一个它左边的红色点和它右边的蓝色点,把它们都擦除。这个问题的“自由度”满足一个四边形不等式,即红色点和蓝色点依次匹配,第 \(i\) 个白色点消耗第 \(i\) 个红色点和第 \(i\) 个蓝色点,这样自由度严格最高。如果这样仍然无解,那么原问题无解。

有了这个引理,我们就可以枚举有多少宝石不选,然后四个维度的限制就变成了两个维度的限制。

解法 3

核心思想:用上下界网络流降低维度。

LR 限制可以转化为对 \(x\) 一维前缀和的限制。UD 同理。这样,我们可以建 \(x, y\) 两条链,一开始 \(n\) 个宝石流进 \(x\) 链,每偷一个就流走一个到 \(y\) 链上,然后做上下界限制就可以了。

AGC038F Two Permutations

用到了使用最小割刻画决策之间矛盾性的原理,在 P4313 文理分科 里同样也有涉及。

一般地,一个点表示决策本身,它以任何一种形式与 \(S\) 连接表示选定方式 A,以任何一种形式与 \(T\) 连接表示选定方式 B,这样可以表示 A,B 之间不能都选。

注意,无需考虑“A,B 之间至少选一种”这个限制,因为网络流是从贡献的角度考虑,并不是真的规定一个点选 A 还是选 B,它的正确性体现在把贡献之间“不可兼得”的矛盾性完备地刻画了出来。

ARC107F Sum of Abs

同样是一道最小割文理分科类的题目,但是增加了一个新技巧:把常用的 \(S \to p \to T\) 变为 \(S \to p_1 \to p_2 \to T\),这样就能刻画三种状态了。

QOJ1825

保留的边只会在最小生成树上,且构成若干个连通块。

注意,除了包含树根的块,每个连通块的贡献是其最浅的那个点到它父亲的那条边(不用选),因此我们用形如 选定点 \(\to\) 最浅点 这样的一条路径刻画连通块,同时钦定每条边仅走一次,再强制选一号节点(最浅的块不会有贡献),跑费用流。

ARC161F Everywhere is Sparser than Whole (Judge)

最小割的可行边 \(u \to v\)

  • 满流;
  • 残量网络上不存在 \(u \to v\) 的路径(即:\(u\)\(v\) 不在同一个强连通分量);

最小割的必选边 \(u \to v\)

  • 满流;
  • 残量网络上 \(S\) 可以到达 \(u\)\(v\) 可以到达 \(T\)(也可以用 tarjan 判断)。

ARC125E Snack

并不是正统的网络流,而是运用最大流 \(=\) 最小割的性质,做模拟最小割(贪心)。

当然 DS 解法也是有的,不过码量很大,属于大材小用了。

P3980 [NOI2008] 志愿者招募ARC137E Bakery

这两道题都运用了一类技巧,可称其为“过程式流”,因为它把每个决策当作流量而不是源汇点;也可以称其为“\(\inf - x\) 流”,因为这类技巧有一个巧妙的理解方法。

以 P3980 为例,先建出 \(1 \to 2, 2 \to 3, \dots, n \to n + 1\) 的一条链,把每类志愿者视作 \(s_i \to t_i\),代价为 \(c_i\),流量为 \(INF\) 的边。再给这条链上每条边 \(i \to i + 1\)\(-a_i\) 的初始流量,表示需要从 \(i + 1 \to i\)\(a_i\) 个人。这样,我们可以把原问题等价为在这个图上做一个无源汇流,直到所有流量非负,此时的最小费用就是原问题的答案。

转化到这里还是不能上费用流,因为负权流量不好处理。但是我们可以设一组源、汇点,考虑钦定流量为 \(\inf\),则 \(i \to i + 1\) 流量为 \(\inf - a_i\),无需考虑负流量了。这样,原问题的答案等价为在这个新图上做 \(1 \to n + 1\) 流量为 \(\inf\) 的最小费用。

这里有一个更好理解的方式:方向思考,原问题等价为有 \(\inf\) 个人工作,但是由于人太多不好管理,第 \(i\) 天至少需要休假 \(a_i\) 人。每个人有 \(m\) 中休假方式,若每种方式所带来的亏损是 \(c_i\),求最小亏损。你会发现这样理解可以导出完全一致的建图。

再对 ARC137E 做类似的思考:假设能获取所有面包的利润,求最少亏损多少钱:检出 \(i \to i + 1\),流量为 \(a_i\),费用为 \(d\) 的边,这条边被流过说明有一个面包师在改日旷工,因此这个面包的利润无法获得;再连上 \(i \to i + 1\),流量为 \(\inf - a_i\),费用为 \(0\) 的流,这样就保证了总流量是 \(\inf\),同时也说明少量面包师旷工没关系,因为可以流这条边不花费用(对应了原问题每天出售上限的限制)。面包师的连边方式同上一道题的志愿者连边方式。

posted @ 2025-02-26 10:00  隱貓柒  阅读(13)  评论(0)    收藏  举报