【题目链接】
【思路要点】
- o p = 0 op=0 op=0 ,算一算两棵树的公共边数即可。
- 时间复杂度 O ( N ) O(N) O(N) 或 O ( N L o g N ) O(NLogN) O(NLogN) 。
- o p = 1 op=1 op=1 ,考虑枚举蓝树上的一个边集 S S S ,强制红树上同样存在这些边,计算将剩余 N − ∣ S ∣ N-|S| N−∣S∣ 个联通块连成一棵树的方案数,更新答案。
- 上述算法中,枚举蓝树上的一个大小为 S S S 的边集后计算将剩余 N − S N-S N−S 个联通块连成一棵树的方案数时,一个包含恰好 T T T 条蓝边的红树会被计算 ( T S ) \binom{T}{S} (ST) 次,并且由于最终的生成树上的蓝边数尚不确定,我们也无法得知需要乘上 y y y 的多少次方。
- 注意到 y − T = ( y − 1 − 1 + 1 ) T = ∑ S = 0 T ( y − 1 − 1 ) S ( T S ) y^{-T}=(y^{-1}-1+1)^T=\sum_{S=0}^{T}(y^{-1}-1)^S\binom{T}{S} y−T=(y−1−1+1)T=∑S=0T(y−1−1)S(ST) ,若看做每选取一条蓝边产生 × ( y − 1 − 1 ) \times(y^{-1}-1) ×(y−1−1) 的贡献,我们就可以直接应用上述算法,只需将最终答案乘以 y N y^N yN 即可。
- 由 P r u f e r Prufer Prufer 序列,将 M M M 个大小分别为 a 1 , a 2 , a 3 , . . . , a M ( ∑ a i = N ) a_1,a_2,a_3,...,a_M\ (\sum a_i=N) a1,a2,a3,...,aM (∑ai=N) 的联通块连成一棵树的方案数为 N M − 2 ∏ a i N^{M-2}\prod a_i NM−2∏ai 。 N M − 2 N^{M-2} NM−2 部分的贡献可以看做每选取一条蓝边产生 × N − 1 \times N^{-1} ×N−1 的贡献,最后将答案乘以 N N − 2 N^{N-2} NN−2 。 ∏ a i \prod a_i ∏ai 部分的贡献对应的组合意义为在每一个联通块内选择恰好一个代表点的方案数。
- 至此,我们可以设计一个简单树形 d p dp dp 来加速上述枚举算法。
- 即记 d p i , 0 / 1 dp_{i,0/1} dpi,0/1 表示 i i i 所在联通块有/没有选出代表点的情况下,其子树内上述算法所有情况的贡献总和,可以 O ( 1 ) O(1) O(1) 简单转移。
- 时间复杂度 O ( N ) O(N) O(N) 。
- o p = 2 op=2 op=2 ,由 o p = 1