CF1867F Most Different Tree 题解

· · 题解

题意:

给定一棵大小为 n 的有根树 G

你要构造一棵大小也为 n 的有根树 G',使得 G' 中存在最多的不与 G 中任何子树同构的子树。

数据范围:n \le 10^6

思路:

重要观察:如果一个子树不与 G 中任何子树同构,那么所有包含其的子树都不会与 G 中的子树同构。

我得到这个观察的途径是考虑 \text{dp},考虑子树合并的方式进行分步决策,容易发现如果其有一个儿子的子树不与任何 G 中子树同构,那么它也就不会与任何 G 中子树同构。

更进一步,我们一旦得到了一个不与 G 中任何子树同构的子树,就可以直接把剩下所有点依次拼接,作为其所有祖先。这样剩下的所有点的子树就都不会与 G 中的子树同构,一定是最优的。

所以现在的目标就是找到一个不与 G 中的任何子树同构的最小子树。

因为包含 k 个点的无标号有根树的个数是指数级别的,所以我们直接把前 n + 1 小的所有无标号有根树全搜出来,然后用树哈希暴力判断即可。

搜索的话考虑按树的大小从小到大搜。

假设这次搜大小为 k 的树,考虑把树分解为根和根的儿子的所有子树,问题等价于找出所有大小和为 k-1 的无标号子树集合,只需要保证编号不降即可保证不重不漏。

复杂度:\Theta(n\cdot f(n))f(n)n 个节点无标号有根树个数函数的反函数,不会超过 20,当然这个复杂度远远跑不满。