Prufer序列
阿新 • • 發佈:2017-05-29
原本 而不是 mathjax pre zoj prufer序列 pru 相同 組合數
構造與轉換
樹->序列 步驟:(是樹,而不是森林)
①、找到當前度數最小的點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序列