树的计数 + prufer序列与Cayley公式(转载)
原文出处:https://www.cnblogs.com/dirge/p/5503289.html
树的计数 + prufer序列与Cayley公式 学习笔记(转载)
首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682
然后是morejarphone同学的博文:http://blog.csdn.net/morejarphone/article/details/50677172
因为是偶然翻了他的这篇博文,然后就秒会了。
prufer数列,可以用来解一些关于无根树计数的问题。
prufer数列是一种无根树的编码表示,对于一棵n个节点带编号的无根树,对应唯一一串长度为n-1的prufer编码。
(1)无根树转化为prufer序列。
首先定义无根树中度数为1的节点是叶子节点。
找到编号最小的叶子并删除,序列中添加与之相连的节点编号,重复执行直到只剩下2个节点。
如下图的树对应的prufer序列就是3,5,1,3。
具体实现可以用一个set搞定,维护度数为1的节点。复杂度O(nlogn)。
(2)prufer序列转化为无根树。
设点集V={1,2,3,...,n},每次取出prufer序列中最前面的元素u,在V中找到编号最小的没有在prufer序列中出现的元素v,给u,v连边然后分别删除,最后在V中剩下两个节点,给它们连边。最终得到的就是无根树。
具体实现也可以用一个set,维护prufer序列中没有出现的编号。复杂度O(nlogn)。
最后有一个很重要的性质就是prufer序列中某个编号出现的次数就等于这个编号的节点在无根树中的度数-1。
一棵n个节点的无根树唯一地对应了一个长度为n-2的数列,数列中的每个数都在1到n的范围内。
上面这句话比较重要。通过上面的定理,
1)我们可以直接推出n个点的无向完全图的生成树的计数:n^(n-2) 即n个点的有标号无根树的计数。
2)一个有趣的推广是,n个节点的度依次为D1, D2, …, Dn的无根树共有 (n-2)! / [ (D1-1)!(D2-1)!..(Dn-1)! ] 个,因为此时Prüfer编码中的数字i恰好出现Di-1次。
即 n种元素,共n-2个,其中第i种元素有Di-1个,求排列数。
3)n个节点的度依次为D1, D2, …, Dn,令有m个节点度数未知,求有多少种生成树?(BZOJ1005 明明的烦恼)
令每个已知度数的节点的度数为di,有n个节点,m个节点未知度数,left=(n-2)-(d1-1)-(d2-1)-...-(dk-1)
已知度数的节点可能的组合方式如下
(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left!
剩余left个位置由未知度数的节点随意填补,方案数为m^left
于是最后有
ans=(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left! * m^left
待填之坑:无标号无根树、有标号有根树、无标号有根树的计数。
参见论文 华中师大一附中 赵爽《树的计数》、南京师范大学附属中学 顾昱洲《Graphical Enumeration》
n个点的 有标号有根树的计数:n^(n-2)*n = n^(n-1)
n个点的 无标号有根树的计数:
n个点的 无标号无根树的计数:an为 n个点的 无标号有根树的计数。
待填之坑:度数有限制时的计数。如烷烃的计数,每个点的度数最大为4
转载于:https://www.cnblogs.com/linruier/p/9726795.html
树的计数 + prufer序列与Cayley公式(转载)相关推荐
- 树的计数 Prüfer编码与Cayley公式 学习笔记
最近学习了Prüfer编码与Cayley公式,这两个强力的工具一般用于解决树的计数问题.现在博主只能学到浅层的内容,只会用不会证明. 推荐博客:https://blog.csdn.net/moreja ...
- bzoj1211 [HNOI2004]树的计数 prufer序列+组合数
如果独自去想出prufer序列实在太难了 所以就只能直接用结论,把树转成prufer序列后这棵树和prufer序列是一一对应的关系 树->prufer序列:每次找到所有叶子结点中编号最小的,删掉 ...
- 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 【XSY1295】calc n个点n条边无向连通图计数 prufer序列
题目大意 求\(n\)个点\(n\)条边的无向连通图的个数 \(n\leq 5000\) 题解 显然是一个环上有很多外向树. 首先有一个东西:\(n\)个点选\(k\)个点作为树的根的生成森林个数为: ...
- BZOJ 1211: [HNOI2004]树的计数 purfer序列
1211: [HNOI2004]树的计数 Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给 ...
- 最小生成树、矩阵树定理、Prufer序列总结
Kruskal算法 按边权排序,从小到大合并不在同一集合两点即可 Prim算法 每次加入一个到当前已选点集最近的点 P2619 [国家集训队]Tree I 考虑二分,每次给白边加上一个mid,通过这种 ...
- BZOJ 1211 树的计数(purfer序列)
首先考虑无解的情况, 根据purfer序列,当dee[i]=0并且n!=1的时候,必然无解.否则为1. 且sum(dee[i]-1)!=n-2也必然无解. 剩下的使用排列组合即可推出公式.需要注意的是 ...
- 模板:Prufer序列
所谓 Prufer 序列,就是 Prufer 发明的序列. (逃) 前言 优雅的神奇魔术. 看名字很高大难,但实际上是高大清(小清新). 很简单的建立起树与序列之间的双射,且这个序列的性质非常良好,且 ...
- 【学习笔记】树的计数,prufer(Prüfer)编码,Cayley公式及相应例题
目录 1.pruferpruferprufer编码 1)无根树转化为prufer序列 2)prufer序列转化为无根树. 2.Cayley公式 1)由Cayley公式得到四个推论 例题1.P4981 ...
- bzoj1211: prufer序列 | [HNOI2004]树的计数
题目大意: 告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树 这里注意数量为0的情况,就是 当 n=1时,节点度数>0 n>1时,所有节点度数相加-n!=n-2 可以通 ...
最新文章
- python里什么叫子图_Python 如何构建多个子图表
- 2020双11,Dubbo3.0 在考拉的超大规模实践
- C#实现字符串按多个字符采用Split方法分割得到数组
- 一文说通异步 LINQ
- jmeter集合点使用方法:Synchronizing Timer
- PIFO到底是什么?【Programmable Packet Scheduling at Line Rate】
- java怎么检测代码安全_foritfy代码安全审计、foritfy代码检测服务、java代码安全审计检测、C/C++语言代码安全审计检测...
- Google 为什么以 Flutter 作为原生突破口?| 技术头条
- YUV422转RGB并显示于Qlabel
- 微信外卖点餐系统开发教程
- tekton pipelineresource资源
- python 发邮件 抄送_Python 发送 email 的三种方式
- wav pcm格式文件解析
- 怎样看股市K线图指标之市场盈亏指标CYS
- 计算机打印后台处理程序在哪里,Win7系统连接打印机出现本地打印后台处理程序服务没有运行怎么办...
- Ubuntu ssh-keygen远程登录
- C. Product 1 Modulo N
- ​什么是响应时间测试?
- 睡眠是锁定计算机怎么设置密码,笔记本电脑如何设置睡眠唤醒密码?
- 《windows》win10禁用默认输入法