A shoulder for the past
直径和
求 n 个点的有标号无根树的直径之和
Solution:
基础思想是找到直径中点拼起来
假设我们能 dp 出来深度为 j 大小为 i 的树和森林的个数
对于奇数的只需要取中间的边就能把树分成两个部分,枚举两个部分的大小即可
偶数需要容斥,取直径的中点,他至少要有两个子树深度为 2d−1 先算存在的,然后枚举大小减去有一个不合法的
具体而言 设 fi,j 表示 i 个点 深度至多为 j 的树个数 ,gi.j 表示 i 个点,深度至多为 j 的森林个数
hi,j 表示 i 个点 深度为 j 的树个数
转移有 fi,j←gi,j−1×i 选定根
gi,j=∑(k−1i−1)fk,jgi−k,j 加上一个新树(注意标号)
奇数直径为 ∑(i−1n−1)hi,d×hn−i,d ,偶数为 hn,d−∑(in)hi,d−1×fn−i,d−1