prufer序列
prufer序列
\(prufer\) 序列是无根树的序列化表示,有标号的无根树与长度为 \(n-2\) 的 \(prufer\) 序列构成双射。
构造方法
将度数为 \(1\) 的节点定义为叶子节点。
对于一棵有标号的无根树,构造一个 \(prufer\) 序列:
-
找到编号最小的一个叶子节点,记为 \(x\) ,将与 \(x\) 相连的节点记为 \(y\) 。
-
删去 \(x\) ,将 \(y\) 节点加入 \(prufer\) 序列。
-
重复 \(1,2\) 操作,直到树中只剩下两个节点为止。
对于一个 \(prufer\) 序列,构造一棵无根树:
设未在 \(prufer\) 序列中出现的点构成的点集为 \(S\)
-
取出 \(prufer\) 序列中第一个元素 \(x\),找到 \(S\) 中编号最小的点记为 \(y\) 。
-
将 \(x\) 与 \(y\) 连边,在 \(prufer\) 序列中删除 \(x\) 。
-
重复 \(1,2\) 操作直到 \(prufer\) 序列为空。
prufer 序列的一些性质
-
对于树中的一个节点 \(x\) ,它在 \(prufer\) 序列中出现的次数 \(=\) 它的度数 \(-1\) 。
证明从略:
每删去一个与 \(x\) 相连的节点时,\(x\) 便会在 \(prufer\) 序列中出现一次,
而删去 \(x\) 的时候,它必定也只会与一个节点相连,于是 \(x\) 在 \(prufer\) 序列中出现的次数就是度数 \(-1\) 。
具体实现可以采用 \(set\) 维护最小值,时间复杂度 \(O(n\log n)\)
也可以用指针维护:时间复杂度 \(O(n)\)。
不过 \(prufer\) 序列的主要作用不在于如何构造或还原一棵树,它的主要应用在于对无标号图的组合计数。
题解:树的计数