ARC142E Pairing Wizards
给出一张图,\(n\) 个点,每个点有属性 \(a_i, b_i\),对于每条边 \((x, y)\) 需要满足以下条件任意一条:
- \(a_x \ge b_x, a_y \ge b_y\)。
- \(a_x \ge b_y, a_y \ge b_x\)。
每次可以花费 \(1\) 的代价将 \(a_i \gets a_i + 1\),求最少满足条件的代价。
\(n \le 100, a_i, b_i \le 100\)。
图论/网络流
血亏啊!当时觉得 E 应该题面简单然后可做,然后想着想着去想 D 去了,看完题解发现自己当初已经开始考虑网络流建图了,同时发现了第一步转化了!(但是没有发掘这个转化的性质)
第一步转化,最好想,但是性质无穷:令 \(mn_x = \max_{(x, y) \in E} \{\min\{b_x, b_y\}\}\),首先让 \(a_i \to mn_i\)(如果不够)。
这个时候就会有比较优秀的性质了:我们记 \(X\) 表示所有 \(b_x > a_x\) 的集合,\(Y = \{1\dots n\} / X\),那么一条边,至少有一个点在 \(Y\) 集合中。
也就是说,如果一条边 \((x, y)\) 不满足条件,假设 \(x \in X\),我们让它合法的条件就是要么使得 \(a_x \to b_x\),要么使得 \(a_y \to b_x\)。
因为 \(n, a_i\) 比较小,考虑网络流建图:
- \(i \in X, (S, i, b_i - a_i)\)
- \(i \in Y, j \in [1, 100], ((i, j), T, 1)\)
- \(i \in Y, j \in [2, 100], ((i, j), (i, j - 1), \infty)\)
- \((x, y) \in E, x \in X, y \in Y, (x, (y, b_x - a_y), \infty)\)(如果 \(b_x > a_y\))
其中 \((i, j)\) 表示一类特殊的点(\(100n\) 个点)。
通过这样建图,我们就可以让 \(x\) 点满足条件或者让 \(y\) 点满足条件并且付出相应的代价。
本博客作者:Werner_Yin(https://www.cnblogs.com/werner-yin/) ,转载时请注明出处,谢谢支持!