题目大意
给定一个 $n$,表示一棵有标号无根树有 $n$ 个结点。
有如下限制:
- 给定 $m$ 个数对 $(x_i,y_i)$,表示树上一定要有 $(x_i,y_i)$ 这条边;
- 有 $k$ 个限制 $op_i\ x_i\ deg_i$,若 $op_i=0$ 表示 $x$ 的度数至少为 $deg_i$,若 $op_i=1$ 表示 $x$ 的度数至多为 $deg_i$。
求合法的树的数量。
$2 \leq n \leq 60,\ 0 \leq m \leq n-1,\ 0 \leq k \leq 60$
1s
题解
有趣~
看到有标号无根树计数,甚至规定了某些点的度数,八九不离十是考虑 prufer 序。
但是有些点已经被初始边连起来了,怎么办呢?
当然是把它们缩起来,一个连通块当作一个新点来考虑啊!
比如 $n=4$,有一条初始边 $(1,2)$,那么缩起来成为连通块 $a$,我们只需考虑 $a,3,4$ 的 prufer 序。然后,在不同的 prufer 序中,$a$ 连出去的边的数量是不一样的,这会造成不同的贡献。
因此需要这么 dp:设 $f_{i,j}$ 表示前 $i$ 个连通块共使用了 $j$ 个 prufer 序位置的方案数。转移就是枚举第 $i$ 个连通块用了多少个 prufer 序位置:
其中 $g_{i,k}$ 表示第 $i$ 个连通块往外连 $k$ 条边的方案数。
所以现在就是要求 $g_{i,j}$。每个点先求出去掉初始边之后的合法度数区间 $[mindg_i,maxdg_i]$(即除初始边外还需要连这么多边),然后对于每个连通块单独考虑,依次考虑每个点,设 $h_{x,j}$ 表示该连通块前 $x$ 个点用了 $j$ 条边的方案数,那么
然后就有 $g_{i,j}=h_{size_i,j}$,$size_i$ 表示该连通块的大小。
这样就是 $O(n^3)$ 的了。(官方题解不知道为什么写了 $O(n^4)$)要再提升的话,就分治 FFT?
代码
1 |
|