bfs 树 + dp 计数问题.
限制可以简单归纳为,图的 bfs 树中,每个点的父亲编号小于自己,且非树边只在同一深度的点间出现.
对 bfs 树进行 dp, 每一层加入的数都一定是编号连续的一段,并且只需要记录上一层的信息就可以转移.
设 $f(i,j)$ 表示考虑了前 $i$ 个点,最深的一层有 $j$ 个点,前 $i-j$ 个点度数已经满足限制,最后 $j$ 个点只考虑向父亲连边.
设 $g(i,j,k)$ 表示上一层有 $j$ 个点度数要求为 $2$ , $k$ 个点度数要求为 $3$ ,这层有 $i$ 个点时的拼接以及上一层内部连边.
枚举上一层有 $k$ 个点,有 $f(i,j)=\sum_{k\le i-j}f(i-j,k)\cdot g(j,c_2,c_3)$ , $c_2,c_3$ 表示 $k$ 个点中要求度数为 $2,3$ 的点,由于它们都各自向父亲连了一条边,实际上还需要连的边数是 $1,2$ .
考虑如何计算转移系数 $g(i,j,k)$ .
当 $i>0$ 时,考虑该层第一个点的父亲是哪个点,有
$$
g(i,j,k)=j\cdot g(i-1,j-1,k)+k\cdot g(i-1,j+1,k-1)
$$
当 $i=0$ 时,此时需要在上一层内互相连边,使得它们满足度数限制,此时再分 $j>0$ 和 $j=0$ 讨论.
当 $i=0,j>0$ 时,枚举第一个还要连 $1$ 条边的点连的哪个点,有
$$
g(0,j,k)=(j-1)\cdot g(0,j-2,k)+k\cdot g(0,j,k-1)
$$
当 $i=j=0$ 时, $k$ 个点都要连 $2$ 条边,一定是若干个互不相交的,大小 $>2$ 的环,这里犯不着 $\exp$ ,暴力预处理即可.
最后答案就是 $\sum f(n,i)\cdot g(0,c_2,c_3)$ ,时间复杂度 $O(n^3)$ .
注意根节点没有向父亲连的边,儿子方向上的度数不会 $-1$ ,需要特判一下,即先将前两层的 $f$ 单独算出来.
1 | //%std |