为什么洛谷对 Atcoder 的 RemoteJudge 挂了啊 :(
# 题面
点击展开/折叠题意
n 个点的有标号基环树,第 i 个点的度数为 $d_i$,求满足条件的基环树的个数对 $10^9+7$ 取模的结果。
# 解析
关于图的计数,尤其是“树”的计数,想到的比较多的就是 prufer 和 Matrix-Tree,这道题便是用 prufer。
但是 prufer 本身只能解决树的计数。
基环树的特点就是把仅有的一个环缩点后变成了一棵树。于是可以考虑计算缩点后对应的树的方案——
假设环的点集为 $S$:
- 构成这个环的方案数即是圆排列 $\frac{(|S|-1)!}2$;
- 缩点后环的度数为 $\sum\limits_{i\in S}(d_i-2)$(即每个点除了和环上相邻两个点连边以外的边)、总点数为 $(n-|S|+1)$,则根据 prufer数列 可重排的性质,缩点得到的树的方案数为
- 虽然环缩成了一个点 x,但是连到 x 上的边实际上有区别,环上每个点的出边数量为 $d_i-2$,则根据可重排,连到环上的边的方案数为
综上,选的点集为 $S$ 对应的方案数为:
化简一下
继续化简:
发现我们需要计算的是 $\prod_{i\in S}(d_i-1)$ 和 $\sum_{i\in S}d_i$,于是定义DP状态:f[i][j][k]
表示前 i 个点,有 j 个在 S 中,此时 $\sum_{i\in S}d_i=k$,对应的所有方案的 $\prod_{i\in S}(d_i-1)$ 之和。
转移 $O(1)$,状态 $O(n^3)$,总复杂度 $O(n^3)$,空间复杂度可以滚掉第一维,即 $O(n^2)$。
# 源代码
1 | /*Lucky_Glass*/ |
THE END
Thanks for reading!
> Linked 三杯空城-网易云