「CF1559D2」Mocha and Diana (Hard Version)
Description
Link:CF1559D2
给出两个森林,节点数均为 ,节点编号均为 。
你可以进行加边操作。每次操作,你需要选择两个不同的正整数 ,然后在两个森林中都加上 。你需要保证两个森林在加边后仍然是森林。
求最多可以加几条边。并给出加边方案。
数据范围:,。
时空限制:s / MiB。
Solution
首先一条边 能添加,当且仅当 在 中均不连通。
可以证明:最终状态下,必定有其中一个森林被合并成了一棵树。
由上述结论,可以得知加边的选择是无关紧要的。
考虑优化这个贪心过程。先尽可能多地加入形如 的边,此时所有节点至少在其中一个图中,与 在同一个连通块。所有的点 可以被分成三类:
- 1 类点:在 中都与 连通。
- 2 类点:在 中与 连通,在 中与 不连通。
- 3 类点:在 中与 不连通,在 中与 连通。
注意到 能添加,当且仅当其中一个点为 2 类点,另外一个点为 3 类点。将 2 类点与 3 类点依次配对连边即可。
特别要注意,对于 来说,每个连通块只能选出一个 3 类点,对于 来说,每个连通块只能选出一个 2 类点。解决方法也很简单,每次找到一个 2 类点或 3 类点 时,就令 在对应图中与 连通。