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\) 点满足条件并且付出相应的代价。

代码

posted @ 2022-06-20 19:24  Werner_Yin  阅读(109)  评论(0编辑  收藏  举报