【学习笔记】Prufer 序列
树的 Prufer 序列
Prufer 序列可以将一棵 \(n\) 个点的无根树用一个长度为 \(n-2\) 的序列表示,且序列中的每个数都是 \([1,n]\) 之间的整数,它的作用在于可以将树与数列建立一个一一对应的双射关系,帮助解决一些有关树的组合计数问题。
对于一棵 \(n\) 个结点的树,其 Prufer 序列的构建过程如下:
- 选择当前编号最小的叶结点,将其删除,并把它的父亲加入到序列末尾。
- 重复以上过程 \(n-2\) 轮,直到最后剩下两个结点时停止。
用小根堆模拟上述过程即可做到 \(O(n\log n)\) 建立 Prufer 序列,当然也存在线性构建方法,但并没有什么用。
Prufer 序列的应用
因为 Prufer 序列与树之间是双射关系,因此可以用来对树计数。
无向完全图生成树个数(Cayley 公式)
设该完全图有 \(n\) 个结点,则其生成树个数为 \(n^{n-2}\)。
证明显然,因为每棵生成树都对应一个 Prufer 序列,等价于问长度为 \(n-2\) 的 Prufer 序列有几种,而 Prufer 序列每个位置都能填 \([1,n]\) 之间的任意整数。
同时这个问题还有个等价描述:\(n\) 个点的无根树个数。事实上改成有根树答案只是变成了 \(n\times n^{n-2}=n^{n-1}\),因为每棵无根树的 \(n\) 个点都能成为根。
给定度数的树个数
不妨假设边都是无向的,如果给定了 \(n\) 个点的度数 \(\deg_1,\deg_2,\deg_3,\ldots,\deg_n\),那么满足要求的树的个数为:
证明同样是简单的,观察 Prufer 序列的构建过程可以得到一个性质:每个点在 Prufer 序列中一定恰好出现了 \(\deg_i-1\) 次,因此给定度数时 Prufer 序列的数字组成已经固定了,共有 \((n-2)!\) 种排列方式,但是每个点都有 \((\deg_i-1)!\) 种重复排列的方式,所以再除去即可。
广义 Cayley 公式
发现这个许多文章并没有记录,但是它是真的有用。
\(n\) 个结点形成的有 \(k\) 棵树的森林,要求给定的 \(k\) 个点中不存在两个点在同一棵树内的方案数为 \(k\times n^{n-k-1}\)。
证明暂时先咕了。
图联通问题(Cayley 公式再扩展)
有一个 \(n\) 个点和若干条边的无向图,共有 \(k\) 个连通块,大小分别为 \(s_1,s_2,\ldots,s_k\),现在要加 \(k-1\) 条边使得整个图联通,则方案数为 \(n^{k-2}\prod_{i=1}^ks_i\)。
证明不会,似乎可以用 Matrix-Tree 或多元二项式定理证。

浙公网安备 33010602011771号