Prufer 序列浅谈
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\) ,把这些连通块连成树的方案数应该为:
其中 \(s_i\) 表示第 \(i\) 个连通块的大小。
考虑如何证明,首先考虑每个连通块都是一个点,设练完边后第 \(i\) 个连通块的度数为 \(d_i\),那么有:
然后关注到上面这个式子每一个方案都对应着一棵树,而每个连通块都需要选出一些点来连边,这些点是可以重复选择的,由此可以得到总的方案数应该为:
考虑多元二项式定理:
所以可以得到原式为: