prufer序列(生成树计数)

Prufer序列

∀ \forall 带标记无根树,有一个Prufer序列,且为一一对应的关系。n个点的树的Prufer序列长度为 n − 2 n-2 n2

→ \to Prufer序列

找到度为1的点中标记最小的点,删除该点,并将与之相连的点加入序列。直到剩余两个点。
在这里插入图片描述

上图为 [ 2 , 2 , 5 , 6 ] [2,2,5,6] [2,2,5,6]

分析

当一个点加入序列时,说明它此时存在一条连向叶子的边,加入时那条边会删除,也就是度-1。

若不存在其它连向叶子的边(最后两个点之间的边不考虑),则不会再次出现在序列中。

由此可以推出,一个点在prufer序列中出现的次数为度数-1。

Prufer序列 → \to

维护一个未出现集合,从前往后遍历Prufer序列。

伪代码:

for p in prufer序列:
	q:set中最小元素
	set.erase(q)
	edge:(p,q)
	if:p为最后一次出现在prufer序列
		set.insert(p)

应用

n个点的标记无根树方案数

n-2个位置,每个都可能是 [ 1 , n ] [1,n] [1,n],所以为 n n − 2 n^{n-2} nn2

n个点的标记有根树方案数

在无根树上选一个点为根,为 n n − 1 n^{n-1} nn1

n个点的标记无根树方案数,要求第i个点度为di

i i i个点出现 d i − 1 d_i-1 di1次。答案为 n − 2 n-2 n2的排列数除去 d i − 1 d_i-1 di1的排列数: ( n − 2 ) ! ∏ ( d i − 1 ) ! \dfrac{(n-2)!}{\prod{(d_i-1)!}} (di1)!(n2)!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值