首页 > 其他分享 >Prüfer 序列

Prüfer 序列

时间:2023-06-18 11:34:41浏览次数:27  
标签:Pr 个点 叶子 fer 序列 节点

目录

Prüfer 序列

Prüfer 序列是将一颗 \(n\) 个有标号的点用一个长度为 \(n-2\) 的序列的表示的方法。

对于一颗有标号的树,会存在唯一一个 Prüfer 序列与之对应。一个 Prüfer 序列也只会对应一颗树。

将一颗树转化为 Prüfer 序列

首先对于所有的叶子节点(此时为 \(1,2,4,6\)),选择其编号最小的节点删掉。然后将其父亲节点加入 Prüfer 序列中。

在重复经过 \(n-2\) 次操作后,剩余了 \(2\) 个点,构造结束。

过程

对于一颗有标号的树:

图片来自 oi wiki

显而易见地是,1. 可以用一个大根堆来维护所有的叶子节点。

  1. 每次取出堆中最大的元素删除。

  2. 在每次删除节点后,判断它的父亲节点是否成为叶子节点,如果是,加入堆中。

这样的做法的时间复杂度是 \(\text O(n\log_2n)\) 的。

(存在线性做法,先gugu)。

性质

可以发现,在 Prüfer 序列中,每个点 \(u\) 的出现次数是其点的度数 \(d_u-1\) 。

  1. 对于叶子节点,一定不会存在 Prufer序列中。

  2. 对于非叶子节点 \(u\),在节点 \(u\) 被删掉前,会有与之相连的 \(d_u-1\) 的节点会被删掉(其原因是在构造 Prufer序列的过程中树是联通的,且树大小始终不小于 \(2\)),在这个过程中,节点 \(u\) 就会被加入 Prufer序列 \(d_u-1\) 次。

由此也可以知道 \(\sum_{i=1}^{n}(d_u-1)=n-2\)。

Prüfer 序列将转化为一颗树

过程

考虑将上述转化的过程,重复一遍。

  1. 对于 Prüfer 序列的第一个数 \(u\) ,和它相连的节点 \(v\) 一定是叶子节点中编号最小的。将 \(u\) 与 \(v\) 连边。

  2. 那么维护一个叶子节点集合 \(S\),将这个编号最小的节点 \(v\) 删掉。

  3. 此时将 Prüfer 序列的第一个数也删掉,由于叶子节点在 Prüfer 序列的出现次数为 \(d-1=0\),那么如果这个数在 Prüfer 序列中的出现次数为 \(0\) 的话,节点 \(u\) 变为叶子节点。

  4. 重复该过程。

这个过程也可以使用堆维护,当然也存在线性做法(gugu)。

性质

  1. 无向完全图的不同生成树数(Cayley公式)

对于一个 \(n\) 个点的无向完全图,任意一个长度为 \(n-2\) 的 Prüfer 序列都可以构造出一个不同的具有 \(n\) 个点的树。

所以讲,会有 \(n^{n-2}\) 个不同的 Prüfer 序列构成 \(n\) 个点的树,那么无向完全图的不同生成树数也就是 \(n^{n-2}\) 个。

  1. \(n\) 个点无根树计数,且已知每个点的点度。

由于每个点在 Prüfer 序列中的出现次数为 \(d_i-1\),所以可以利用组合知识求出。

\[\binom{n-2}{b_1-1}\cdot\binom{(n-2)-(b_1-1)}{b_2-1}\cdots\binom{b_n-1}{b_n-1} \]

展开可以得到

\[\frac{(n-2)!}{\prod_{i=1}^{n}(b_i-1)} \]

标签:Pr,个点,叶子,fer,序列,节点
From: https://www.cnblogs.com/Cnghit/p/17488769.html

相关文章

  • 【C】专家编程 (Expert C Programming) 阅读笔记
      第一章C:穿越时空的迷雾  1p22~24 ANSIC有此问题。“安静”的类型转换原则:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高,长度更长的方向转换,整形术如果转换为singed不会丢失信息,就转换为signed,否则转换为unsign......
  • VirtualAllocEx;WriteProcessMemory;CreateRemoteThread
    /*structStrParam{ HWNDhPwdEdit; unsignedintnLenth; char*buff;};//计算器为目标进程。staticDWORDWINAPIMyFunc(LPVOIDpData){//dosomething StrParam*param=(StrParam*)pData; HWNDhPwdEdit=param->hPwdEdit; char*buff=param->buff; ......
  • Probably caused by : avipbb.sys ( avipbb+ab1d )
    ****************************************************************************************Yourdebuggeris......
  • Spring Boot单体应用引入sleuth链路追踪
    文章目录前言一、问题模拟二、引入sleuth链路跟踪1、引入sleuth的maven依赖2、添加属性配置3、logback配置4、日志信息5、通过@NewSpan注解声明新的Span三、引入Sleuth链路跟踪的好处四、Sleuth概念说明五、Logback的MDC特性前言最近排查生产环境的异常时发现一个问题,虽然找到了......
  • Primes on Interval(欧拉筛+二分+滑动窗口)
    【题面】你决定用素数定理来做一个调查.众所周知,素数又被称为质数,其含义就是除了数字一和本身之外不能被其他任何的数字除尽.现在给定一个正整数序列 ,+1,⋯ ,a,a+1,⋯,b (≤)(a≤b),请找出一个最小值 l,使其满足对于任意一个长度为 l 的子串,都包含 k 个质数.......
  • Spring —— IOC
    Spring—IOC传统方式:先前service层调用dao实现类:常用new方式,高耦合(即依赖——模块与模块之间的联系)而好的程序应该是:高内聚(模块内部功能的联系)低耦合New的方式就是写死了,是硬编码(一般来说应该是要避免的)要改变的话就是改源代码将紧耦合变......
  • olevariant序列
    olevariant序列///<author>cxg2020-12-31</author>unityn.variant;interfaceusesclasses,zlib,Variants,SysUtils;{$IFNDEFUNICODE}typeRawByteString=AnsiString;{$ENDIF}{$ifCompilerVersion<18}//beforedelphi2007type......
  • 解决find命令报错: paths must precede expression
    解决find命令报错:pathsmustprecedeexpression 在一天早上,想在服务器/tmp目录清除一些pdf文件,大概一万多个文件,在执行命令的时候find/tmp-maxdepth1-mtime30-name*.pdf出现了错误:find:pathsmustprecedeexpressionUsage:find[-H][-L][-P][......
  • SpringBoot中跨域问题的处理
    跨越问题产生原因:产生跨域问题的原因是浏览器的同源策略,所谓同源是指:域名,协议,端口相同。如果不同,将会出现跨域问题。一、创建项目我们创建两个项目,一个命名为provider提供服务,一个命名为consumer消费服务,第一个项目端口配置为8080,第二个项目端口配置为8081,然后在provider中提供一个......
  • SpringBoot整合RocketMQ
    前提是必须已经安装了RocketMQ并配置好相关的环境变量(自行百度) 第一步: 第二步: 第三步:  第四步: ......