题目链接:bzoj1211
题意:
给你一个n个点,以及每个点的度数,求他们构成的树的个数。
N<=150
题解:
这道题要用到一个东西,叫prufer序列,它可以唯一表示一棵树,树也有唯一的prufer序列,它的构造和还原,是这样的。
构造:选取编号最小的叶子节点删掉,并将它的父亲加入到prufer数列中,直到树上还有两个节点。假设一个点入度为d,它最多有可能在prufer上出现(d-1)次(普通节点不可能因为父亲出现在prufer上,根节点由于prufer构造时要留两个点所以也会有一个儿子无法使它出现在prufer上) ,所以一共有n-2个数字出现在prufer上,其中每个相同数字出现d-1次。
还原:由 prufer 得到一棵树,先将所有编号为 1 到 n 的点的度赋初值为 1,然后加上它在 prufer中出现的次数,得到每个点的度
先执行 n-2 步,每一步,选取具有最小标号的度为 1 的点 u 与 purfer 中的第 i 个数 v 表示的顶点相连,得到树中的一条边,并将 u 和 v 的度减一,最后再把剩下的两个度为 1 的点连边,加入到树中。
我们由前面可以知道,每个i在prufer里面出现了(d[i]-1)次,我们可以求这些数的排列方式有多少种,便可以知道有多少种树了。
于是我要求的便是 (n-2)!/(d[1]-1)!……(d[i]-1)!,(i在prufer中出现)
bzoj1211
最新推荐文章于 2019-07-27 15:09:45 发布
![](https://img-home.csdnimg.cn/images/20240611030827.png)