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 ...
随机推荐
- C#两大知名Redis客户端连接哨兵集群的姿势
前言 前面利用<Docker-Compose搭建Redis高可用哨兵集群>, 我们的思路是将Redis.Sentinel.Redis Client App链接到同一个网桥网络,这个网桥内的 ...
- MySQL学习之路7-索引、事务、函数、存储过程、游标
索引 使用索引快速定位某列中特定值的行,不需要遍历数据表所有行. 创建索引的数据结构:BTREE and HASH. 主键也是一种索引,Primary key. show index from ord ...
- C# 基础知识系列- 9 字符串的更多用法(一)
0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...
- Python中list(列表)、dict(字典)、tuple(元组)、set(集合)详细介绍
更新时间:2019.08.10 更新内容: "2.14加入sorted()函数" "2.3"加入一种删除元素的方法 "二.字典"新增1.5, ...
- Continue 和 Break
1.什么是continue和break continue:继续的.持续的 break:冲断的.折断的 作用:用于终止循环体,主要用于switch条件语句和循环体条件语句(for.while.do-wh ...
- 数据挖掘入门系列教程(九)之基于sklearn的SVM使用
目录 介绍 基于SVM对MINIST数据集进行分类 使用SVM SVM分析垃圾邮件 加载数据集 分词 构建词云 构建数据集 进行训练 交叉验证 炼丹术 总结 参考 介绍 在上一篇博客:数据挖掘入门系列 ...
- EOS基础全家桶(八)jungle测试网的使用
简介 前面我们已经学习了一些EOS的基础知识了,但是在EOS主网上的很多操作(比如:抵押.赎回.买卖内存)都是需要EOS链被正式激活后才可使用,而激活EOS链还需要很多的准备操作,我打算在单独的一篇文 ...
- Laravel异步队列全攻略
最近项目需求,研究了laravel的异步队列.官方文档虽然很是详细,但也有些晦涩难懂,在此记录下步骤,供大家参考. 1.修改/config/queue.php文件 <?php return [ ...
- TortoiseSVN的使用,以及冲突解决办法
接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态, ...
- APT32入侵我国,试图窃取COVID-19相关情报
新闻一篇: 一直以来,APT32都以东南亚为攻击目标,并且是近几年来针对中国大陆进行攻击活动最活跃的APT攻击组织,没有之一.此次再将目标对准中国,与新冠疫情离不开关系. 4月22日,Fireye发布 ...