Prufer 序列浅谈

发布时间 2023-07-13 21:34:44作者: NuclearReactor

prufer 序列完成了从一棵大小为 \(n\) 的无根树到长度为 \(n-2\) 的序列的双射,下面简述其构造过程:

  • 从一棵无根树到 Prufer 序列:

找到其编号最小的叶子,然后删掉叶子,把其父亲加入队列。重复操作,直到整棵树剩下两个节点。

\(O(n\log n)\) 是显然可以做的,考虑如何 \(O(n)\)

用一个指针,指向当前编号最小的叶子节点,然后删掉他,如果其父亲变成了叶子,并且编号比它小,我们就删掉其父亲并重复操作,否则往后推指针,找到下一个叶子。

  • 从 Prufer 序列到一棵无根树:

容易发现,每个节点的度数是在 Prufer 序列中的出现次数加 \(1\),现在知道每个点的度数,我们找到编号最小的叶子,然后删掉它,如果其父亲也变成了叶子,并且编号较小,重复这个操作,否则的话,往后推指针,找到下一个叶子。最后会剩下两个点,其中一个节点是 \(n\),我们只需要在 Prufer 序列最后加入 \(n\) 就可以避免特判。

所以大小为 \(n\) 的有标号无根树数量为 \(n^{n-2}\)

不过更需要注意的是,上面定义的叶子是不严谨的。
prufer 序列是有标号无根树与长度为 \(n-2\) 序列的一种双射,由此可以知道有标号无根树的个数为 \(n^{n-2}\) 个。而所谓的叶子,实际上就是度数为 \(1\) 的点。而之所以定义了父亲等,是因为我们假设以 \(n\) 为根,而其一定是不会被删掉的。

可以得到比 Cayley 定理(有标号无根树个数的定理)更强的定理,如果给定了 \(k\) 个连通块,点的总数为 \(n\) ,把这些连通块连成树的方案数应该为:

\[n^{k-2}\prod s_i \]

其中 \(s_i\) 表示第 \(i\) 个连通块的大小。

考虑如何证明,首先考虑每个连通块都是一个点,设练完边后第 \(i\) 个连通块的度数为 \(d_i\),那么有:

\[\sum\limits_{d_i\ge 1,\sum d_i=2k-2}\dbinom{k-2}{d_1-1,d_2-1,\cdots,d_k-1} \]

然后关注到上面这个式子每一个方案都对应着一棵树,而每个连通块都需要选出一些点来连边,这些点是可以重复选择的,由此可以得到总的方案数应该为:

\[\sum\limits_{d_i\ge 1,\sum d_i=2k-2}\dbinom{k-2}{d_1-1,d_2-1,\cdots,d_k-1}\prod s_i^{d_i} \]

考虑多元二项式定理:

\[(\sum\limits_{i=1}^{k}x_i)^n=\sum\limits_{\sum_{i=1}^k d_i=n}\dbinom{n}{d_1,d_2,\cdots,d_k}\prod_{i=1}^k x_i^{d_i} \]

所以可以得到原式为:

\[\prod s_i (\sum\limits_{i=1}^k x_i)^{k-2}=n^{k-2}\prod s_i \]