内容主要总结自 OI Wiki,仅作个人记录。
简介
Prüfer 序列是一种在「包含 n ( n ≥ 2 ) n(n\ge 2) n(n≥2) 个有编号结点的无根树」与「整数序列 a ( a i ∈ [ 1 , n ] , ∣ a ∣ = n − 2 ) a(a_i\in[1,n],|a|=n-2) a(ai∈[1,n],∣a∣=n−2)」之间建立双射的方法。
原理
由树到序列的映射
每次选择树中编号最小的叶结点删除,并将与其连接的结点编号加入序列尾。重复 n − 2 n-2 n−2 次,剩下两个结点。
O ( n ) O(n) O(n) 实现:维护编号值域上的指针 p p p,初始指向最小叶结点编号。假设一次删除后新增了叶结点 x x x,若 x < p x<p x<p 则继续删除 x x x,否则让 p p p 自增到第一个未删除的叶结点并删除。
由序列到树的映射
维护每个结点的度。正向遍历序列,每次选择度为 1 的最小编号结点与序列元素对应结点连接,然后减小这两个结点的度。重复 n − 2 n-2 n−2 次,剩下两个度为 1 的结点。
O ( n ) O(n) O(n) 实现:同理,维护指针 p p p。假设一次连接后新增了度为 1 的结点 x x x,若 x < p x<p x<p 则继续使用 x x x 连接,否则让 p p p 自增到第一个度为 1 的结点并使用其连接。
应用
证明凯莱公式
凯莱公式:完全图 K n K_n Kn 有 n n − 2 n^{n-2} nn−2 棵生成树。
完全图 K n K_n Kn 的生成树集即「包含 n ( n ≥ 2 ) n(n\ge 2) n(n≥2) 个有编号结点的无根树」集,而该集合与「整数序列 a ( a i ∈ [ 1 , n ] , ∣ a ∣ = n − 2 ) a(a_i\in[1,n],|a|=n-2) a(ai∈[1,n],∣a∣=n−2)」集有双射关系,因此前者大小等于后者大小,即 n n − 2 n^{n-2} nn−2。
结论拓展:包含 n n n 个有编号结点的有根树有 n n − 1 n^{n-1} nn−1 种。