Prufer 序列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prufer 序列相关的知识,希望对你有一定的参考价值。
给 $n$ 个带标号点的无根树,可以构造 Prufer 序列:每次找标号最小的叶子,将与其相邻的结点加入 Prufer 序列中,然后将这个叶子节点删去,直到这棵树只有 $2$ 个节点。
尝试对一个长度为 $n-2$ 、每一项在 $1$ 到 $n$ 之间的 Prufer 序列 $Q$ ,求出它对应的无根树:从小到大依次扫描 Prufer 序列的第 $x$ 项,那么在 $x$ 之后没有出现、且没有被删除的点一定是叶子节点,于是找到最小的满足条件的点,将这个点与 $Q_x$ 连边;最后还剩下了两个没有被删除的节点,将它们连边。
长度为 $n-2$ 、每一项在 $1$ 到 $n$ 之间的 Prufer 序列与 $n$ 个点的无根树一一对应,只需要证明对于任意的 $x \in [0, n-2)$ ,扫描到 Prufer 序列的第 $x+1$ 项时,能够找到一个在 $x$ 之后没有出现、且没有被删除的点。这时候一共有 $n - x$ 个点可以被选择,且由 Prufer 序列知有至多 $n - 2 - x$ 个点不能够被选择,所以一定至少有 $2$ 个叶子节点可以被选择,所以得证。
综上,长度为 $n-2$ 、每一项在 $1$ 到 $n$ 之间的 Prufer 序列与 $n$ 个点的无根树一一对应。
Prufer 序列的一个经典应用是证明 Caley 公式:$n$ 个点的带标号无根树的个数为 $n ^ {n - 2}$ 。
如果要对有根树个数进行计数,那么只需要枚举根,而根一共有 $n$ 个,所以 $n$ 个点的带标号有根树个数为 $n ^ {n - 1}$ 。
限制每个点的度数恰好为 $d_1, d_2, ..., d_n$ ,如何计算这 $n$ 个点构建的满足度数限制的无根树个数?
在 Prufer 序列中,第 $i$ 个点出现的次数为 $d_i - 1$ ,所以树的个数为 $\begin{aligned} \binom{n - 2}{d_1 - 1, d_2 - 1, ..., d_n - 1} \end{aligned}$ 。
限制每个点的度数不超过 $d_1, d_2, ..., d_n$ ,如何计算这 $n$ 个点构建的满足度数限制的无根树个数?
考虑一个流程,构建所有合法的 Prufer 序列:从 $1$ 到 $n$ 依次进行,每次将不超过 $d_i - 1$ 个 $i$ 插入 Prufer 序列中,且满足总长度不超过 $n-2$ 。
用 DP 套上这个流程,设 $f[i][j]$ 表示考虑了前 $i$ 个数,序列的总长度为 $j$ 的方案数。边界为 $f[0][0] = 1$ ,答案为 $f[n][n - 2]$ 。转移:$\begin{aligned} f[i][j] = \sum_{k \le d_i - 1} \binom{j}{k} f[i-1][j - k] \end{aligned}$ 。
将 Prufer 序列推广到有根树。
给一棵 $n$ 个带标号节点的有根树,可以构造出 有根树 Prufer 序列:每次找标号最小的叶子,将与其相邻的结点加入 Prufer 序列中,然后将这个叶子节点删去。
给一个长度为 $n-1$ 、前 $n-2$ 项在 $1$ 到 $n$ 、最后一项为根的有根树 Prufer 序列,求出它对应的有根树:从小到大依次扫描 Prufer 序列的第 $x$ 项,那么除根以外、在 $x$ 之后没有出现、且没有被删除的点一定是叶子节点,于是找到最小的满足条件的点,然后将 $Q_x$ 向这个点连有向边。
长度为 $n-1$ 、前 $n-2$ 项在 $1$ 到 $n$ 、最后一项为根的有根树 Prufer 序列与 $n$ 个点的有根树一一对应,只需要证明对于任意的 $x \in [0, n-1)$ ,扫描到 Prufer 序列的第 $x+1$ 项时,能够找到一个除根以外、在 $x$ 之后没有出现、且没有被删除的点。这时候一共有 $n - 1 - x$ 个点可以选择,且由 Prufer 序列知有至多 $n - 1 - x$ 个点不能够被选择,注意到 Prufer 序列中包含了根,所以至多有 $n - 2 - x$ 个除根以外的点不能够被选择,所以至少存在 $1$ 个点可以被选择,所以得证。
综上,长度为 $n-1$ 、前 $n-2$ 项在 $1$ 到 $n$ 、最后一项为根的有根树 Prufer 序列与 $n$ 个点的有根树一一对应。
如果要求对有根树计数,也可以从有根树 Prufer 序列的角度进行理解。
将 Prufer 序列推广到有根树构成的森林(简称有根森林)。
给 $K$ 棵共有 $n$ 个带标号节点的有根树,类似地,可以构造出长度为 $n-K$ 、前 $n-K-1$ 项在 $1$ 到 $n$ 、最后一项为某个根节点的有根森林 Prufer 序列。
给长度为 $n-K$ 、前 $n-K-1$ 项在 $1$ 到 $n$ 、最后一项为某个根节点的有根森林 Prufer 序列,类似地,求出它的对应有根森林。
长度为$n-K$ 、前 $n-K-1$ 项在 $1$ 到 $n$ 、最后一项为某个根节点的有根森林 Prufer 序列与 $n$ 个点的有根树一一对应,只需要证明对于任意的 $x \in [0, n-K)$ ,扫描到有根森林 Prufer 序列的第 $x+1$ 项时,能够找到一个除根以外、在 $x$ 之后没有出现、且没有被删除的点。这时候一共有 $n-K-x$ 个点可以选择,且由 Prufer 序列知有至多 $n - K - x$ 个点不能够选择,注意到 Prufer 序列中包含了根,所以至多有 $n - K - 1 - x$ 个除根以外的点不能够被选择,所以至少存在 $1$ 个点可以被选择,所以得证。
综上,长度为$n-K$ 、前 $n-K-1$ 项在 $1$ 到 $n$ 、最后一项为某个根节点的有根森林 Prufer 序列与 $n$ 个点的有根树一一对应。
如果要计算把 $n$ 个带标号点划分到 $K$ 个有根森林的方案数,就先钦定 $K$ 个根,然后枚举 Prufer 序列,所以方案数为 $\binom{n}{K} n ^ {n - K - 1} K$ 。
$n$ 个带标号点的基环树计数。
枚举环上的点数 $K$ ,环排列乘上划分到 $K$ 个有根森林进行计数。
$\begin{aligned} ans_n & = \sum_{K = 3} ^ n \binom{n}{K} n ^ {n - K - 1} K \times (k-1)! \\ & = \frac{n!}{2} \sum_{K = 3} ^ n \frac{n ^ {n - K - 1}}{(n - K)!} \end{aligned}$
可以线性求出 $ans[]$ 的某一项。
以上是关于Prufer 序列的主要内容,如果未能解决你的问题,请参考以下文章