樹的 Prufer 序列
Prufer 序列可以將一棵 \(n\) 個點的無根樹用一個長度為 \(n-2\) 的序列表示,且序列中的每個數都是 \([1,n]\) 之間的整數,它的作用在於可以將樹與數列建立一個一一對應的雙射關係,幫助解決一些有關樹的組合計數問題。
對於一棵 \(n\) 個結點的樹,其 Prufer 序列的構建過程如下:
- 選擇當前編號最小的葉結點,將其刪除,並把它的父親加入到序列末尾。
- 重複以上過程 \(n-2\) 輪,直到最後剩下兩個結點時停止。
用小根堆模擬上述過程即可做到 \(O(n\log n)\) 建立 Prufer 序列,當然也存線上性構建方法,但並沒有什麼用。
Prufer 序列的應用
因為 Prufer 序列與樹之間是雙射關係,因此可以用來對樹計數。
無向完全圖生成樹個數(Cayley 公式)
設該完全圖有 \(n\) 個結點,則其生成樹個數為 \(n^{n-2}\)。
證明顯然,因為每棵生成樹都對應一個 Prufer 序列,等價於問長度為 \(n-2\) 的 Prufer 序列有幾種,而 Prufer 序列每個位置都能填 \([1,n]\) 之間的任意整數。
同時這個問題還有個等價描述:\(n\) 個點的無根樹個數。事實上改成有根樹答案只是變成了 \(n\times n^{n-2}=n^{n-1}\),因為每棵無根樹的 \(n\) 個點都能成為根。
給定度數的樹個數
不妨假設邊都是無向的,如果給定了 \(n\) 個點的度數 \(\deg_1,\deg_2,\deg_3,\ldots,\deg_n\),那麼滿足要求的樹的個數為:
證明同樣是簡單的,觀察 Prufer 序列的構建過程可以得到一個性質:每個點在 Prufer 序列中一定恰好出現了 \(\deg_i-1\) 次,因此給定度數時 Prufer 序列的數字組成已經固定了,共有 \((n-2)!\) 種排列方式,但是每個點都有 \((\deg_i-1)!\) 種重複排列的方式,所以再除去即可。
廣義 Cayley 公式
發現這個許多文章並沒有記錄,但是它是真的有用。
\(n\) 個結點形成的有 \(k\) 棵樹的森林,要求給定的 \(k\) 個點中不存在兩個點在同一棵樹內的方案數為 \(k\times n^{n-k-1}\)。
證明暫時先咕了。
圖聯通問題(Cayley 公式再擴充套件)
有一個 \(n\) 個點和若干條邊的無向圖,共有 \(k\) 個連通塊,大小分別為 \(s_1,s_2,\ldots,s_k\),現在要加 \(k-1\) 條邊使得整個圖聯通,則方案數為 \(n^{k-2}\prod_{i=1}^ks_i\)。
證明不會,似乎可以用 Matrix-Tree 或多元二項式定理證。