prufer编码学习笔记
prufer 编码
对于一个无根树,他的 prufer 编码是这样确定的:
- 每次找到编号最小的一个叶子节点,也就是度数为\(1\)的节点,把和它相连的点,加入 prufer 编码序列的末尾,然后把这个点从树中删掉
- 如果当前树只有两个节点了,就停止
那么,通过给定的无根树求 prufer 编码就很简单了
比如下面这个无根树,它的 prufer 编码就是\(\texttt{125214}\)

这个 prufer 编码有一些很显然的性质
首先长度肯定是\(n-2\),但每个元素可能相同,然后对于每个无根树,它的 prufer 编码肯定也唯一
如果编码的每个元素都相同,那么它可以是一个编号最大的点连向其它所有点(特殊的菊花图),如果都不同,可以是一个链
当然,这里说“可以”是因为有可能还存在其它的构造方式
那么,prufer 编码对应的树是否唯一?
也就是说,每一个编码是不是只能求出唯一的树?
是可以的,先给出求的方式:
设这棵树点的集合为\(V\),初始状态下\(V=\{1,2,\cdots,n\}\)
- 每次找到编码最前面的一个点,在\(V\)中找到不在编码序列中出现的编号最小的点,连边,然后分别把他们在\(V\)中和编码中删掉
- 显然,当编码被全部删掉后,\(V\)中还有两个元素,再把他们两个连边,结束
然后验证一下刚才那个图,发现是正确的
可以感性理解一下,编码序列的第一个数,就是我们第一次删除叶子节点以后添加的它的相邻节点,而这个被删掉的节点肯定不在编码中,它也是序号最小的,所以还原树的时候就要把它和它相邻的那个被添加到编码中的点连边
然后每次都这样做就得出了原树
又因为在找编码的时候最后剩了两个节点,那两个节点肯定是连在一起的,所以这就是为什么要把\(V\)中剩下的两个点连边
所以,上面通过 prufer 编码求树的操作,也是唯一的
那么可以得出一下更深入的性质:
- prufer 编码和无根树一一对应
- 对于有\(n\)个节点的无根树,有\(n^{n-2}\)种构造方式
因为编码和树一一对应,所以长度为\(n-2\),每一位有\(n\)种取值的编码的种类数是\(n^{n-2}\),这个东西也叫做 Cayley 公式 - 对于有\(n\)个节点的有根树,有\(n^{n-1}\)种构造方式,很显然,就是让每个节点轮流当根,然后运用上面那个式子
- 度数为\(k\)的点,在 prufer 编码中出现的次数是\(k-1\)
因为在\(k-1\)个点被删掉的时候,它被加入编码,此时度数为\(1\),直接被删掉不会加入编码中 - 对于给定\(n\)个点的度数分别是\(k_1,k_2,\cdots,k_n\)的有根树,有\(\dfrac{(n-2)!}{\prod (k_i-1)!}\)种构造方式
问题即为求每个元素出现\(k_i\)次的排列个数,分子的\((n-2)!\)是说,没有这个限制条件的全排列个数,分母上是去重,就是说如果相同的元素交换位置应该算一种方案,所以要除以它的阶乘 - 上面那个性质再扩展一下,假设有\(cnt\)个点对度数有要求,其它的没要求,设\(sum=\sum_{i=1}^{cnt}k_i\),则方式有:
\(\tbinom{n-2}{sum}\frac{sum!}{\prod_{i=1}^{cnt}(k_i-1)!}\times (n-cnt)^{n-2-sum}\)
解释一下什么意思,那个组合数就是从\(n-2\)个数里面算出\(sum\)个,然后对这\(sum\)个用上一条性质的公式,然后还有\(n-2-sum\)个位置可以任意排列剩下的\(n-cnt\)个点,所以得出上面式子
应该没有了,如果有大佬知道其它性质欢迎在评论区给出
然后有一些题,这些在tulun-prufer编码的分类中有题解
P4430 小猴打架
P4981 父子
P2290 [HNOI2004]树的计数
P2624 [HNOI2008]明明的烦恼
prufer编码学习笔记的更多相关文章
- prufer序列学习笔记
prufer序列是一个定义在无根树上的东西. 构造方法是:每次选一个编号最小的叶子结点,把他的父亲的编号加入到序列的最后.然后删掉这个叶节点.直到最后只剩下两个节点,此时得到的序列就是prufer序列 ...
- Base64编码——学习笔记
Base64是一种编码方式. 非加密 chcp->936 编码流程: 位数不够后面补0,例中补了2个0. 末尾加=表示结束符. GB2312,有些敏感词不能显示. GBK,是GB2312升级版. ...
- prufer 序列 学习笔记
prufer 序列是一种无根树的序列,对于一个 \(n\) 个点的树,其 prufer 序列的长度为 \(n-2\). prufer 序列和原树之间都可以唯一地相互转化. 构造 构造 prufer 序 ...
- 零基础HTML编码学习笔记
任务目的 了解HTML的定义.概念.发展简史 掌握常用HTML标签的含义.用法 能够基于设计稿来合理规划HTML文档结构 理解语义化,合理地使用HTML标签来构建页面 任务描述:完成一个HTML页面代 ...
- 稀疏编码学习笔记(二)L2范数
L2范数 除了L1范数,还有一种更受宠幸的规则化范数是L2范数: ||W||2.它也不逊于L1范数,它有两个美称,在回归里面,有人把有它的回归叫“岭回归”(Ridge Regression),有人也叫 ...
- 学习笔记:Prufer 编码
Prufer 编码可以将无根树与序列之间进行转化. 一个 \(n\) 个点.区分编号的无向图 和 Prufer 序列一定是一一对应的,下面会给出映射方式. 借此可以证明 Cayley 定理: \(n\ ...
- [原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- java web 学习笔记 编码问题总结
java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...
- 【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码
一.H.264中的熵编码基本方法: 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用 在H ...
随机推荐
- 中阶 d06.1 cookie && session && jsp介绍
##Cookie > 饼干. 其实是一份小数据, 是服务器给客户端,并且存储在客户端上的一份小数据 ### 应用场景 > 自动登录.浏览记录.购物车. ###为什么要有这个Cookie & ...
- centOS7常用操作命令
大多和DOS命令差不多 文件与目录操作 命令 解析 cd /home 进入 ‘/home’ 目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd - 返回上次所在目录 cp fil ...
- mysql截取函数常用方法 即mysql 字符串 截取-- - 最后带上java字符串截取规则比较
常用的mysql截取函数有:left(), right(), substring(), substring_index() 下面来一一说明一下: 1.左截取left(str, length) 说明:l ...
- shell执行${var:m:n}报错Bad substitution解决办法
Ubuntu系统下,执行字符串截取脚本时,总是报错:Bad substitution,脚本非常简单如下: #!/bin/sh str1="hello world!" :} 执行后报 ...
- 数据结构和算法(Golang实现)(15)常见数据结构-列表
列表 一.列表 List 我们又经常听到列表 List数据结构,其实这只是更宏观的统称,表示存放数据的队列. 列表List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序号的数 ...
- PHP代码审计(初级篇)
一.常见的PHP框架 1.zendframwork: (ZF)是Zend公司推出的一套PHP开发框架 功能非常的强大,是一个重量级的框架,ZF 用 100%面向对象编码实现. ZF 的组件结构独一无二 ...
- 如何用python爬虫从爬取一章小说到爬取全站小说
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...
- 【selenium】各种exception
selenium中的Exception解释 exception selenium.common.exceptions.ElementClickInterceptedException(msg=None ...
- overload 与override的区别
Override 是重写: 方法名称.参数个数,类型,顺序,返回值类型都是必须和父类方法一致的.它的关系是父子关系Overload 是重载: 方法名称不变,其余的都是可以变更的.它的关系是同一个类 ...
- selemiun 问题总结
1.如果打开一个网页定位一个元素时发现不能够定位某一个元素,并且定位的方法没问题,则需要看下该网页是否有frame框架 解决办法: 如果有frame框架则需要先切换到frame框架下: driver. ...