prufer序列

prufer序列

\(prufer\) 序列是无根树的序列化表示,有标号的无根树与长度为 \(n-2\)\(prufer\) 序列构成双射。

构造方法

将度数为 \(1\) 的节点定义为叶子节点。

对于一棵有标号的无根树,构造一个 \(prufer\) 序列:

  1. 找到编号最小的一个叶子节点,记为 \(x\) ,将与 \(x\) 相连的节点记为 \(y\)

  2. 删去 \(x\) ,将 \(y\) 节点加入 \(prufer\) 序列。

  3. 重复 \(1,2\) 操作,直到树中只剩下两个节点为止。

对于一个 \(prufer\) 序列,构造一棵无根树:

设未在 \(prufer\) 序列中出现的点构成的点集为 \(S\)

  1. 取出 \(prufer\) 序列中第一个元素 \(x\),找到 \(S\) 中编号最小的点记为 \(y\)

  2. \(x\)\(y\) 连边,在 \(prufer\) 序列中删除 \(x\)

  3. 重复 \(1,2\) 操作直到 \(prufer\) 序列为空。

prufer 序列的一些性质

  • 对于树中的一个节点 \(x\) ,它在 \(prufer\) 序列中出现的次数 \(=\) 它的度数 \(-1\)

    证明从略:

    每删去一个与 \(x\) 相连的节点时,\(x\) 便会在 \(prufer\) 序列中出现一次,

    而删去 \(x\) 的时候,它必定也只会与一个节点相连,于是 \(x\)\(prufer\) 序列中出现的次数就是度数 \(-1\)

具体实现可以采用 \(set\) 维护最小值,时间复杂度 \(O(n\log n)\)

也可以用指针维护:时间复杂度 \(O(n)\)

不过 \(prufer\) 序列的主要作用不在于如何构造或还原一棵树,它的主要应用在于对无标号图的组合计数。

题目:[HNOI2004]树的计数 - 洛谷

题解:树的计数

posted @ 2022-07-27 22:32  mklzc  阅读(60)  评论(0编辑  收藏  举报