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 ~ dnprufer序列的排列问题。
根据第二条性质,度数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中还有两个点,连接两点
posted @ 2021-03-20 19:06  Paranoid5  阅读(149)  评论(0编辑  收藏  举报