Prufer编码
Prufer编码
1.概念
给定一棵带标号的无根树,找出编号最小的叶子结点,写下与它相邻的节点的编号,然后删掉这个叶子结点。反复执行这个操作直到只剩两个节点为止。由于节点数\(n>2\)的树总存在叶子节点,因此一棵\(n\)个节点的无根树唯一对应了一个长度为\(n - 2\)的数列,数列中的每个数都在\(1\)至\(n\)的范围内。
将Prufer序列中第一个数与没有出现在Prufer序列中的第一个数连边;之后按次序依次将第\(2,3,…,n - 2\)个数与其对应的未出现在Prufer序列中的第\(2,3,…,n - 2\)个数连边;最后剩下两个点直接连边。这样就重新构建出来了原来的无根树。
这样每一棵\(n\)个节点的无根树唯一的对应了一个\(n - 2\)长度的数列,数列中的每个数都在\(1\)至\(n\)的范围内。
2.性质
- 易得\(n\)个点的无向完全图的生成树计数(\(n\)个点的有标号无根树的计数)为\(n^{n-2}\)。
- Prufer序列中某个编号出现的次数等于此编号节点在树中的度数减一。
- 有\(n\)个节点,每个节点的度数分别为\(D_{1}, D_{2}, …,D_{n}\),此时无根树的个数为\(\dfrac{(n - 2) !}{[(D_{1} - 1)! (D_{2} - 1)!…(D_{n} - 1)!]}\)个,因为此时Prufer编码中的编号\(i\)出现了\(D_{i} - 1\)次。(即\(n - 2\)个元素,各不相同,其中第\(i\)种元素有\(D_{i} - 1\)个,求排列数)(例题:洛谷P2290)
- 与上问条件相同,另有\(m\)个节点度数未知。设\(left = (n - 2) - (D_{1} - 1) - (D_{2} - 1) - … - (D_{n} - 1)\),则已知节点可能组合方式为\(\dfrac{(n - 2) !}{[(D_{1} - 1)! (D_{2} - 1)!…(D_{n} - 1)!] \cdot left}\),剩余\(left\)个位置由\(m\)个未知度数的节点自由填补,方案数为\(m^{left}\)。所以答案为\(\dfrac{(n - 2) !}{[(D_{1} - 1)! (D_{2} - 1)!…(D_{n} - 1)!] \cdot left} \times m^{left}\)。(例题:洛谷P2624)
(因为有高精所以没写)