Prufer序列
∀ \forall ∀带标记无根树,有一个Prufer序列,且为一一对应的关系。n个点的树的Prufer序列长度为 n − 2 n-2 n−2
树 → \to →Prufer序列
找到度为1的点中标记最小的点,删除该点,并将与之相连的点加入序列。直到剩余两个点。
上图为 [ 2 , 2 , 5 , 6 ] [2,2,5,6] [2,2,5,6]
分析
当一个点加入序列时,说明它此时存在一条连向叶子的边,加入时那条边会删除,也就是度-1。
若不存在其它连向叶子的边(最后两个点之间的边不考虑),则不会再次出现在序列中。
由此可以推出,一个点在prufer序列中出现的次数为度数-1。
Prufer序列 → \to →树
维护一个未出现集合,从前往后遍历Prufer序列。
伪代码:
for p in prufer序列:
q:set中最小元素
set.erase(q)
edge:(p,q)
if:p为最后一次出现在prufer序列
set.insert(p)
应用
n个点的标记无根树方案数
n-2个位置,每个都可能是 [ 1 , n ] [1,n] [1,n],所以为 n n − 2 n^{n-2} nn−2
n个点的标记有根树方案数
在无根树上选一个点为根,为 n n − 1 n^{n-1} nn−1
n个点的标记无根树方案数,要求第i个点度为di
第 i i i个点出现 d i − 1 d_i-1 di−1次。答案为 n − 2 n-2 n−2的排列数除去 d i − 1 d_i-1 di−1的排列数: ( n − 2 ) ! ∏ ( d i − 1 ) ! \dfrac{(n-2)!}{\prod{(d_i-1)!}} ∏(di−1)!(n−2)!