3194. 【HNOI模拟题】化学(无标号有根树、无根树计数)

版权声明:蒟蒻写的文章,能看就行了,同时欢迎大佬们指点错误 https://blog.csdn.net/Algor_pro_king_John/article/details/86774453

https://jzoj.net/senior/#main/show/3194

Problem
  • n n 个点的每个点度数不超过 4 4 的无标号无根树个数.
Data constraint
  • 1 n 500 1\le n\le 500
Solution
  • 尝试着把问题一般化。我们来考虑一个这样的问题:求 n n 个节点,每个节点度数不超过 m m 的无根树个数。

  • 为了解决这个问题,我们不妨先来解决有根树的情况。注意这里的树都是无标号的。所以每一种合法树的根的子树的 s i z e size 都可以看做是单调的。然而无根树的计数实在很麻烦。例如在无根树中以下两种情况视作同一种:在这里插入图片描述
    在这里插入图片描述

  • 而在有根树情况下,这两种方案显然是不一样的。

  • 但注意,对于有根树这两种情况也是一样的:

在这里插入图片描述
在这里插入图片描述

  • 所以转化成有根树,我们可以更方便的进行DP。并且通过上面这两幅图我们发现唯一需要注意的是子树 s i z e size 的关系。

  • 不妨令 f i , j f_{i,j} 表示当前根节点度为 j j ,总共有 i i 个节点时的方案数。此外,我们理应记录一下当前子树的最大 s i z e size ,然后每次枚举个更大的 s i z e size 去尝试着转移。但实质上我们可以不用记录,我们直接从小到大枚举这个 s i z e size ,然后尝试转移.

  • 枚举当前最大子树的个数 k k ,令 s = k = 0 m 1 f ( s i z e , k ) s=\sum^{m−1}_{k=0}f(size,k) ,我们不难写出这样一个式子: f ( i , j ) = k f ( i s i z e × k , j k ) { s + k 1 k } f(i,j)=\sum_{k}f(i−size×k,j−k)\left\{ \begin{matrix}s+k-1\\k \end{matrix} \right\}

  • 其中 { s + k 1 k } \left\{ \begin{matrix}s+k-1\\k \end{matrix} \right\} 表示的是在 s s 个盒子中放 k k 个球,盒子不同,球相同,可以重复放的方案。这正好符合我们的要求。不难发现,我们这样枚举的 s i z e size 一定可以保证子树是单调的,那么避免了算重。

  • 解决了有根树,我们现在来考虑无根树的问题。事实上,有一个极其巧妙且重要的性质:两颗无根树同构,则以它们重心为根的有根树同构

  • 那么我们就只需保证 s i z e ( n 1 ) > > 1 size\le (n-1)>>1 即可。唯一需要注意的是,当一棵树有两个重心的时候,我们的 s i z e size 都是小于 n 2 \frac{n}{2} 的,所以我们要特殊处理一下两个 s i z e = n 2 size=\frac{n}{2} 的拼接,这也同样是一个组合数。

猜你喜欢

转载自blog.csdn.net/Algor_pro_king_John/article/details/86774453