码迷,mamicode.com
首页 > 其他好文 > 详细

Prufer序列

时间:2017-05-29 17:25:40      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:frame   序列   for   span   roc   小数   不同的   个数   post   

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*=A(n-2-sum,di-1),sum+=di-1;//A(x,y)=x!/(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...

总结

  利用性质转换为序列问题,然后组合数求解。

Prufer序列

标签:frame   序列   for   span   roc   小数   不同的   个数   post   

原文地址:http://www.cnblogs.com/Oncle-Ha/p/6918308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!