1. 程式人生 > >Prufer序列

Prufer序列

原本 而不是 mathjax pre zoj prufer序列 pru 相同 組合數

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序列