樹的計數 + prufer序列與Cayley公式 學習筆記

首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682編碼

 

而後是morejarphone同窗的博文:http://blog.csdn.net/morejarphone/article/details/50677172spa

由於是偶然翻了他的這篇博文,而後就秒會了。.net

prufer數列,能夠用來解一些關於無根樹計數的問題。3d

prufer數列是一種無根樹的編碼表示,對於一棵n個節點帶編號的無根樹,對應惟一一串長度爲n-1的prufer編碼。blog

(1)無根樹轉化爲prufer序列。io

首先定義無根樹中度數爲1的節點是葉子節點。class

找到編號最小的葉子並刪除,序列中添加與之相連的節點編號,重複執行直到只剩下2個節點。im

以下圖的樹對應的prufer序列就是3,5,1,3。word

具體實現能夠用一個set搞定,維護度數爲1的節點。複雜度O(nlogn)。img

 

(2)prufer序列轉化爲無根樹。

設點集V={1,2,3,...,n},每次取出prufer序列中最前面的元素u,在V中找到編號最小的沒有在prufer序列中出現的元素v,給u,v連邊而後分別刪除,最後在V中剩下兩個節點,給它們連邊。最終獲得的就是無根樹。

具體實現也能夠用一個set,維護prufer序列中沒有出現的編號。複雜度O(nlogn)。

 

最後有一個很重要的性質就是prufer序列中某個編號出現的次數就等於這個編號的節點在無根樹中的度數-1。

 

 

 

 

 

一棵n個節點的無根樹惟一地對應了一個長度爲n-2的數列,數列中的每一個數都在1到n的範圍內。

上面這句話比較重要。經過上面的定理,

1)咱們能夠直接推出n個點的無向徹底圖的生成樹的計數:n^(n-2)   即n個點的有標號無根樹的計數。

 

2)一個有趣的推廣是,n個節點的度依次爲D1, D2, …, Dn的無根樹共有   (n-2)! / [ (D1-1)!(D2-1)!..(Dn-1)! ]  個,由於此時Prüfer編碼中的數字i剛好出現Di-1次。

即 n種元素,共n-2個,其中第i種元素有Di-1個,求排列數。

 

3)n個節點的度依次爲D1, D2, …, Dn,令有m個節點度數未知,求有多少種生成樹?(BZOJ1005 明明的煩惱)

令每一個已知度數的節點的度數爲di,有n個節點,m個節點未知度數,left=(n-2)-(d1-1)-(d2-1)-...-(dk-1)

已知度數的節點可能的組合方式以下

(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left!

剩餘left個位置由未知度數的節點隨意填補,方案數爲m^left

因而最後有

ans=(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left! * m^left

 

 

待填之坑:無標號無根樹有標號有根樹無標號有根樹的計數。   

參見論文 華中師大一附中 趙爽《樹的計數》、南京師範大學附屬中學 顧昱洲《Graphical Enumeration》

 

n個點的 有標號有根樹的計數:n^(n-2)*n = n^(n-1)

n個點的 無標號有根樹的計數:

n個點的 無標號無根樹的計數:an爲 n個點的 無標號有根樹的計數。

 

待填之坑:度數有限制時的計數。如烷烴的計數,每一個點的度數最大爲4。

相關文章
相關標籤/搜索