prufer序列
prufer序列
1.用处:可以解决和度数相关的树上计数问题。
2.性质
(1)prufer序列与无根树一一对应
(2)度数为di的结点会在prufer序列中出现di-1次。
参考后面的转化过程,每一个点有多少个子节点,就会在序列中出现多少次。然后当他没有子节点时,度数为1此时就会被删掉。累计计算di-1次。
(3)一个n个结点的无向完全图的生成树的个数是nn-2(Cayley公式)。
n个结点的树的prufer序列长度为n-2,每一个位置上的数字有n种可能。
所以有nn-2种可能。
(4)对于给定度数为d1 ~ dn的一颗无根树共有\(\frac{(n-2)!}{\prod_{i=1}^n(d~i~-1)!}\)种情况。
根据第一条性质,这个问题可以转化为:度数为d1 ~ dn的prufer序列的排列问题。
根据第二条性质,度数di的结点i会重复出现di-1次。
即全排列个数除以重复元素内部的全排列个数(贝叶斯定理)。
\([P2290](https://www.luogu.com.cn/problem/P2290)\)
3.prufer序列与无根树的转化
从无根树到prufer序列
while(树中的点数大于2){
x = find(度数为1,编号最小的点);
delete(x);
father = x的父亲;
prefur.push(father);
}
//每次出一个点,一共n-2个点
从prufer序列到无根树
set:一个点集,里面是树上点的编号
while(prufer序列不为空){
x = find(prufer序列中最前面的数);
y = find(set中不在prufer序列中的最小数);
make_edge(x,y);
}
现在set中还有两个点,连接两点