参考博客https://www.cnblogs.com/dirge/p/5503289.html
(1)prufer数列是一种无根树的编码表示,类似于hash。
一棵n个节点带编号的无根树,对应唯一串长度为n-2的prufer编码。所以一个n阶完全图的生成树个数就是
。
首先定义无根树中度数为1的节点是叶子节点。
找到编号最小的叶子并删除,序列中添加与之相连的节点编号,重复执行直到只剩下2个节点。
(2)prufer序列转化为无根树。
我们设点集为{1,2...n}。然后我们每次找到点集中没有出现在prufer序列中的最小的点(这一定是这个时刻删除的叶子节点),然后再取出prufer序列中的第一个元素,两个点建边,在将两个点在分别删除。
重要性质:prufer序列中某个编号出现的次数就是这个编号节点的度数-1。
很多时候,无根树树的问题都可以转化为求解prufer序列的问题,从而大大简化了问题。
下面提供了三道例题。
例题:
BSOJ 2503 -- 【HNOI2004】树的计数
Description
一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。
给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数。
Input
第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。
Output
输出满足条件的树有多少棵。
Sample Input
4 2 1 2 1
Sample Output
2
Hint

根据“prufer序列中某个编号出现的次数就是这个编号节点的度数-1”这一性质,这道题就变成了给定元素个数的排列问题。
。
代码:
#include
#include
#include
#include
#include
#include
#include
#include
BSOJ 5553 -- 【模拟试题】wangyurzee的树
Description
wangyurzee有n个各不相同的节点,编号从1到n。wangyurzee想在它们之间连n-1条边,从而使它们成为一棵树。
可是wangyurzee发现方案数太多了,于是他又给出了m个限制条件,其中第i个限制条件限制了编号为u[i]的节点的度数不能为d[i]。 一个节点的度数,就是指和该节点相关联的边的条数。 这样一来,方案数就减少了,问题也就变得容易了,现在请你告诉wangyurzee连边的方案总数为多少。 答案请对1000000007取模。
Input
第一行输入2个整数n(1<=n<=1000000),m(0<=m<=17)分别表示节点个数以及限制个数。
第2行到第m+1行描述m个限制条件,第i+1行为2个整数u[i],d[i],表示编号为u[i]的节点度数不能为d[i]。
为了方便起见,保证1<=ui<=m。同时保证1<=ui<=n,1<=di<=n-1,保证不会有两条完全相同的限制。
Output
输出一行一个整数表示答案。
Sample Input
3 1 1 2
Sample Output
2
显然要容斥。我们就用{总的方案数}-{不满足一个条件的方案数}+{不满足两个条件的方案数}-...
注意有个坑点,就是如果我们枚举的两个条件的u相同,那么方案数直接为0。
然后就是如何计数的问题。假设我们已经定了k个点的度数d[1],d[2]...d[k]。设
。那么方案数就是
。
代码:
#include
#include
#include
#include
#include
#include
#include
#include
BSOJ 5445 -- 【2018雅礼】树
Description
有n个点,第i个点的限制为度数不能超过ai。
现在对于每一个s(1<=s<=n),问从这n个点中选出s个点组成有标号无根树的方案数。
Input
第一行一个整数表示n。
第二行n个整数a1~an。
Output
输出仅一行n个整数,第i个整数表示s=i时的答案。
Sample Input
3 2 2 1
Sample Output
3 3 2
Hint
【数据范围】
对于20%的数据,n≤6。
对于60%的数据,n≤50。
对于100%的数据,n≤100。
我们说过,处理无根树计数的问题可以转化为prufer序列的计数问题。
我们设
长度为i的prufer序列,用了j个点的方案数。考虑新增一个点v,我们假设它的度数为
,然后就可以得到转移方程
。
最后特判s=1时,答案是n,s>=2是,答案是
。
代码:
#include
#include
#include
#include
#include
#include
#include
#include