Prufer
Prufer
主要用于树计数。
定义(注意这不是官方定义):把一个 n 个点的有标号无根树用一个长度为 \(n - 2\) 值域在 \([1, n]\) 的序列来表示,把这个序列称为 Prufer 序列,并且可以使用构造法证明Prufer序列与有标号无根树一一对应。
构造证明
从树构造 Prufer
Prufer 序列是树字典序最小的拓扑序的前 n - 2 项。
构造方法1:使用一个堆来维护所有叶子中编号最小的点,取出点后更新它父亲的度数。\(O(n\log n)\).
线性构造法:使用一个指针 P 来扫编号。如果扫到一个点度数大于 1 就跳过;度数等于 1 就把这个点的父亲加入 prufer 序列末尾,并且将其父亲度数减一。如果发现它的父亲变成了叶子(度数为 1),那么查看它父亲的编号。如果它的编号大于 P,就等到以后来处理;如果编号小于 P,那么立即把这个点的父亲加入 prufer 序列末尾,然后再看父亲的父亲节点是否变成了叶子节点...
如果你对这两种构造为何是等价的感到不解,建议随便画一颗树手动模拟。
从 Prufer 构造树
刚才我们有一个非常费解的操作,就是我们只取了最小字典序拓扑序的前 n - 2 项,这其实是为了满足 Prufer 的一个性质:每个点的度数恰好等于它在树中出现的次数 + 1,假设把最后两个点加入了,那么这么统计出来根的度数就多了 1。
由此观之,我们可以从 prufer 得到每个点的度数。我们可以用每个点的父亲构成的序列来表示一个树,可以假设这个树的根为 n。
然后把找到编号最小的叶子节点,那么这个叶子节点就对应了 prufer 序列的第一个数,也就是说 prufer 序列的第一个数就是这个点的父亲。
于是我们可以用类似于 从树构造 Prufer 的线性构造法 来构造 Prufer。
应用
利用Prufer序列与有标号无根树一一对应,我们可以知道一张有标号完全图的生成树数量为 \(n^{n-2}\)。

浙公网安备 33010602011771号