Prufer序列

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的树”,才想起错了。

posted @ 2017-05-29 16:43  Oncle_Ha  阅读(328)  评论(0编辑  收藏  举报