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