Prufer序列
构造与转换
树->序列 步骤:(是树,而不是森林)
①、找到当前度数最小的点x(相同的取标号小的)
②、删除x及其边。将所有与x相邻的点加入当前prufer序列后面。
不断重复①、②直到图中只有两个点。
序列->树 步骤:(保证树原本序号为排列,设G={1..n})
①、找到G在Prufer序列中未出现的最小数x
②、x向Prufer序列首项y连边,然后将x从G中删除,将Prufer首项删除(只删一个)。
不断重复①、②直到G中只有两个点,连一条边。
性质
设树中每个点度数为$d_i$,那么点i会在Prufer序列中出现$d_i-1$次。ps:$\sum d_i=2*n-2$
不同的Prufer序列对应不同的无根树。(没有出现的都按钦点的顺序连边,以保证标号不同)
不同的定义:树形不同或标号不同。(不能经过旋转拉伸变成一样的树)
例题
BZOJ1211:给出每个点的度数,求不同合法的树个数。
根据上述构造方法:$Ans=(n-2)!*\prod \frac{1}{(d_i-1)!}$ 或者利用组合数计算
程序实现(排列计算):
for(Ans=1,sum=0,i=1;i<=n;i++) Ans*=C(n-2-sum,di-1),sum+=di-1;//C(x,y)=x!/y!(x-y)!
ps:该题需要判树不存在的情况。
BZOJ1005:有些点度数未知,求不同合法的树个数。
记Sum为已知度数的方案数,Sd为已知点的$\sum d_i -1$,m为未知的点数,$Ans=Sum*C(n-2,n-2-Sd)*m^{n-2-Sd}$
大概需要一个高精度。T^T
BZOJ1430:自己看题吧。
$Ans=(n-1)!*n^{n-2}$ ps:$n^{n-2}$意味无根树个数,$(n-1)!$即边的出现顺序。
注意long long...
总结
利用性质转换为序列问题,然后组合数求解。
UPD:把组合写成排列,直到做了“wangyurzee的树”,才想起错了。