CF1559 D1&D2 题解
先来看看 Easy Version。数据范围:\(1\le n\le 10^3\)。
结论:最终态的两片森林中至少有一片是一棵树。
证明:
当第一片森林中只有一棵树时,原命题成立。
于是设第一片森林中至少有两棵树。设其中两棵分别为 \(A\) 和 \(B\),那么 \(\forall a\in A,b\in B\),它们在第一片森林中均不联通。由于是最终态,若它们在第二片森林中仍不连通,则必然能再连边 \((a,b)\),不满足最终态定义。因此 \(\forall a\in A,b\in B\),在第二片森林中 \(a\) 与 \(b\) 必然连通。从而 \(A\) 和 \(B\) 在第二片森林中属于同一棵树。同理可得第一片森林中所有的树在第二片中都属于同一棵树,即第二篇森林中只有一棵树。从而原命题成立。
因此,无论加入合法边顺序不同,甚至加入的合法边都不同,最终加入的边数是相同的,即 \((n-1)-\min(m1,m2)\)。
看到 \(1\le n\le 10^3\) 的数据范围,考虑直接枚举两点 \(a\) 和 \(b\),若满足 \(a\ne b\) 且连边前 \(a,b\) 在两片森林都不连通,那我们就连上这条边。这种策略是在上述结论下得出的,因此是正确的。使用带路径压缩和按秩合并的并查集,时间复杂度为 \(O(n^2\alpha(n))\)。
再来看看 Hard Version。数据范围:\(1\le n\le 10^5\)。
考虑优化贪心。根据上面的结论,我们可以先找一个中心点 \(s\),然后尝试将所有点与其连边。然后设第一片森林为 \(A\),第二片森林为 \(B\)。设 \(A\) 中不与 \(s\) 连通的点集为 \(P\),\(B\) 中不与 \(s\) 连通的点集为 \(Q\)。\(\forall a\in P\),\(s\) 与 \(a\) 不能连边的原因是因为 \(s\) 与 \(a\) 在 \(B\) 中已经连通。同理 \(\forall b\in Q\),\(s\) 与 \(b\) 在 \(A\) 中已经连通。因此 \(P\cap Q=\varnothing\)。注意到此时 \(a\) 和 \(b\) 已经满足连边条件,我们只需再满足连边前 \(a,b\) 在两片森林都不连通即可。使用带路径压缩和按秩合并的并查集,时间复杂度近似为 \(O(n+m)\)。
当然,官方题解的解法也是值得借鉴的,其中没有使用按秩合并,时间复杂度为 \(O(n\log^2n)\),在这里就挂出 链接。
本篇题解参考了 lijunhan 的 CF1599D1 题解 和 Macesuted 的 CF1599D2 题解。