前言
\(prufer\)序列應該是一個比較實用的東西。
據\(hl666\)大佬說,一切與度數有關的樹上計數問題,都可以用它以及它的性質來解決。
而聽說\(ZJOI\)最近特別喜歡出計數題,所以有必要學一學。
轉化\(1\):從無根樹到\(prufer\)序列
現在,給你一棵樹,我們要考慮如何把它變成\(prufer\)序列。
我們需要重復進行以下操作,直至樹中只剩下兩個點:
- 找到一個度數為\(1\),且編號最小的點。(其中編號最小保證了后面將會提到的\(prufer\)序列的唯一對應性,同時也方便從\(prufer\)序列轉化回無根樹)
- 把這個點的父親節點加入序列,然后把這個點從樹中刪除。
然后我們就得到了一個長度為\(n-2\)的序列,這就是\(prufer\)序列。
所以它有什么實際意義呢?
我也不知道。
以上面的圖為例,我們可以模擬這一過程如下:
- 找到\(4\)號節點,將其父結點加入序列,然后將其刪去。此時序列:\(\{2\}\)。
- 找到\(5\)號節點,將其父結點加入序列,然后將其刪去。此時序列:\(\{2,3\}\)。
- 找到\(3\)號節點,將其父結點加入序列,然后將其刪去。此時序列:\(\{2,3,1\}\)。
- 找到\(6\)號節點,將其父結點加入序列,然后將其刪去。此時序列:\(\{2,3,1,2\}\)。
- 找到\(2\)號節點,將其父結點加入序列,然后將其刪去。此時序列:\(\{2,3,1,2,1\}\)。
所以,最后得到的\(prufer\)序列就是\(\{2,3,1,2,1\}\)。
轉化\(2\):從\(prufer\)序列到無根樹
還是以剛才那棵樹為例吧,我們要考慮如何把它的\(prufer\)序列變回它本身。
我們需要重復進行以下操作,直至點集中只剩下兩個點:(初始化所有點都在點集中)
- 取出\(prufer\)序列最前面的元素\(x\)。
- 取出在點集中的、且當前不在\(prufer\)序列中的最小元素\(y\)。(這恰好呼應了前面提到過的選取編號最小的節點)
- 在\(x,y\)之間連接一條邊。(注意前面的取出相當於刪除)
最后,我們在點集中剩下的兩個點中連一條邊。
顯然這有\(n-1\)條邊,且絕對不會形成環,因此它是一棵樹,且就是原樹。
以上面的序列為例,我們可以模擬這一過程如下:
- 取出\(2,4\)連邊。此時\(prufer\)序列:\(\{3,1,2,1\}\),點集:\(\{1,2,3,5,6,7\}\)。
- 取出\(3,5\)連邊。此時\(prufer\)序列:\(\{1,2,1\}\),點集:\(\{1,2,3,6,7\}\)。
- 取出\(1,3\)連邊。此時\(prufer\)序列:\(\{2,1\}\),點集:\(\{1,2,6,7\}\)。
- 取出\(2,6\)連邊。此時\(prufer\)序列:\(\{1\}\),點集:\(\{1,2,7\}\)。
- 取出\(1,2\)連邊。此時\(prufer\)序列:\(\{\}\),點集:\(\{1,7\}\)。
最后再在\(1,7\)間連邊,就可以得到原樹了。
\(prufer\)序列的性質及相關結論
講了這么多,我們最關鍵的還是\(prufer\)序列的一些性質,以及與其有關的一些結論。(畢竟前面也提到過,我也不知道這東西有什么實際意義)
-
重要性質:\(prufer\)序列與無根樹一一對應。
這應該顯然吧,通過前面的介紹應該可以直接得出。
而由這個性質,我們才能推導出后面的結論。
-
度數為\(d_i\)的節點會在\(prufer\)序列中出現\(d_i-1\)次。
當某個節點度數為\(1\)時,會直接被刪掉,否則每少掉一個相鄰的節點,它就會在序列中出現\(1\)次。
因此共出現\(d_i-1\)次。
-
一個\(n\)個節點的完全圖的生成樹個數為\(n^{n-2}\)。
對於一個\(n\)個點的無根樹,它的\(prufer\)序列長為\(n-2\),而每個位置有\(n\)種可能性,因此可能的\(prufer\)序列有\(n^{n-2}\)種。
又由於\(prufer\)序列與無根樹一一對應,因此生成樹個數應與\(prufer\)序列種樹相同,即\(n^{n-2}\)。
-
對於給定度數為\(d_{1\sim n}\)的一棵無根樹共有\(\frac{(n-2)!}{\prod_{i=1}^n(d_i-1)!}\)種情況。
由上面的性質可以知道,度數為\(d_i\)的節點會在\(prufer\)序列中出現\(d_i-1\)次。
則就是要求出\(d_i-1\)個\(i(1\le i\le n)\)的全排列個數。
而上面那個式子就是可重全排列公式。(即全排列個數除以重復元素內部的全排列個數)
大致就是這些。
例題
下面有兩道例題:【洛谷2290】[HNOI2004] 樹的計數和【洛谷2624】[HNOI2008] 明明的煩惱。
實際上,這兩道題都只用了由\(prufer\)序列所推導得到的結論,而沒有真正構造\(prufer\)序列,應該也不算特別好的例題。。。