$Prufer$序列
\(Prufer\)序列
\(Prufer\)序列与树的相互转换:
树->\(Prufer\)序列
找到一个编号最小的叶子结点,把这个点删掉并且把跟他连着的那个点的编号加入\(Prufer\)序列。
\(Prufer\)序列->树
设集合\(S={1,\cdots,n}\)
找到一个不在\(Prufer\)序列中且在\(S\)中的数,将它与\(Prufer\)序列中的第一个元素连边,并将这个数和\(Prufer\)序列的第一个元素删掉。
最后\(S\)会剩下最后两个元素,把这两个元素连边。
性质
性质\(1\)
\(Prufer\)序列与无根树一一对应。
性质\(2\)
\(n\)个点有编号的无根树有\(n^{n-2}\)个。
或\(n\)个点的完全图的生成树个数有\(n^{n-2}\)个。
性质\(3\)
度数为\(d\)的点在\(Prufer\)序列中出现\(d-1\)次。
例题
[HNOI2004]树的计数
给定度数\(d_1\sim d_n\),求有多少树。
定理:给定度数\(d_1\sim d_n\)的无根树有\(\frac{(n-2)!}{\prod\limits_{i=1}^n{(d_i-1)!}}\)
证:
\(Prufer\)序列中\(i\)元素出现\(d_i-1\)次。
\(n-2\)个元素的排列有\((n-2)!\)。
然后每一种元素自己内部的排列有\((d_i-1)\)。
相除即可。实际上就是可重排列。
[HNOI2008]明明的烦恼
\(n\)个点给定\(k\)个点的度数\(d_1\sim d_k\),求有多少树。
这题是上一道题的拓展。
我们先设\(s=\sum\limits_{i=1}^k (d_i-1)\)。
在\(Prufer\)序列中这\(k\)个点会出现\(s\)次,这里的方案数为\({n-2}\choose{s}\)。
然后我们考虑这\(k\)个点的排列,跟上一问一样的计算,方案数为\(\frac{s!}{\prod\limits_{i=1}^k (d_i-1)}\)。
最后我们考虑剩下\(n-2-s\)个位置,每个位置可以填\(n-k\)个数中的一个,方案数为\((n-k)^{n-2-s}\)。
所以总的答案就是\({{n-2}\choose{k}}\frac{s!}{\prod\limits_{i=1}^k (d_i-1)}(n-k)^{n-2-s}\)
随机推荐
- k8s中flannel:镜像下载不了
重新部署一套K8S集群时,由于K8S需要扁平化的网络,所以当执行下面的 root@master ~]# kubectl apply -f kube-flannel.yml 会开始下载镜像,然后去启动, ...
- confluence部署
confluence -- 团队文档的管理平台. 首先要在confluence官网买key. 部署 安装jdk 1.8 环境 查看机器是否自带 java -version,没有再安装. yum ins ...
- Horizon7.9部署和克隆问题汇总
1 基础环境说明 采用Windows server +SQL Server 2014进行部署,对接现有环境中的AD预控,系统版本为Windows server .桌面虚拟化软件版本采用Horizon ...
- shell编程连接postgres数据库(数据备份)
第一步:通过xshell或者其他工具连接到linux服务, 第二步:创建一个脚本:touch se.sh 第三步:输入i,代表开始输入内容 输入以下命令: 脚本如下:(sql语句可以是任何复杂的sql ...
- 记一次elastic-job使用
当当的elastic-job定时任务 业务场景是定时从微信取accesstoken和jsticket,因为都只有7200秒的有效时间,所以设置了定时任务,定时将得到的数据存到redis缓存中 问题1: ...
- 二、Smarty中的三种主要变量
1.从PHP中分配的变量 $smarty -> assign(); 从PHP分配给模板使用的变量:动态变量 2.从配置文件中读取的变量 $smarty配置文件中的内容不是PHP读取,而是就在sm ...
- CopyOnWriteArrayList使用
1.在遍历操作数量大大超过可变操作是(add,set等等)使用.原因是其可变操作是通过对底层数据进行一次新的复制来实现的. 2.迭代器创建后,其不会反应列表的添加.移除或更改.其迭代器是”快照“风格的 ...
- 全面解读PHP-数据结构
一.常见数据结构 1.Array 数组 最简单且应用最广泛的数据结构之一 特性:使用连续的内存来存储,数组中的所有元素必须是相同的类型或类型的衍生(同质数据结构),元素可以通过下标直接访问. 2.Li ...
- 简单的python下载器
最近在玩爬虫,有时候会爬下来很多感兴趣文件的连接. 如果自己手动下载它们的话工作量实在太大. 于是,简单写了个下载小脚本: import os, urllib2 os.chdir(r'd:') url ...
- 四十五:数据库之SQLAlchemy之subquery实现复杂查询
子查询让多个查询变成一个查询,只需要查找一次数据库,性能相对来讲更高效,不用写多个SQL语句就可以实现一些复杂的查询,在SQLAlchemy中要实现一个子查询,应该使用以下步骤:1.将子查询按照传统方 ...