prufer 序列是一种无根树的序列,对于一个 \(n\) 个点的树,其 prufer 序列的长度为 \(n-2\)。

prufer 序列和原树之间都可以唯一地相互转化。


构造

构造 prufer 序列分为如下的步骤:

  1. 找到一个编号最小的度数为 \(1\) 的点;
  2. 与这个点相邻的点的编号加入 prufer 序列的后面;
  3. 删除这个点;
  4. 重复上述步骤,知道原树只剩下 \(2\) 个点,这两个点之间应该有一条边。

还原

令集合 \(V = \{1, 2, \cdots, n\}\)。

  1. 取出 prufer 序列最前面的点 \(x\);
  2. 找到 \(V\) 序列中最小的没有在现在的 prufer 序列中出现过的点 \(y\);
  3. 将 \(x\) 和 \(y\) 连边并从集合 \(V\) 中删除 \(y\),从 \(prufer\) 序列中删除最前面的 \(x\)。

  4. 重复上述步骤,直到 prufer 序列被遍历完;此时 \(V\) 中应该还剩下两个点,给它们连边。

考虑这样还原为什么是对的。

每一次被配对的 \(y\),应该是原树在删掉 prufer 序列 \(x\) 之前的点后的叶子。

那么根据之前的构造步骤,这个 \(y\) 必须满足:

  1. 是个叶子,这个条件等价于没有在后面的 prufer 序列中出现。
  2. 之前没有被选过;
  3. 编号最小。

于是就有了上面的选 \(y\) 的条件了。


性质

性质 1

一棵无根树的每个点的度数等于这个点在 prufer 序列中的出现次数 \(+1\)。

这个结论很显然,由构造过程就可以发现。

性质 2

一棵有标号的无根树的数量为 \(n^{n-2}\)。

可以发现我们的还原过程中,prufer 序列本身没有任何限制。

只要是长度为 \(n-2\),值域为 \(n\) 的序列,都可以还原成一棵树。


性质 3

如果限定了每个点的度数,编号为 \(i\) 的点的度数为 \(a_i\),那么方案为 \(\frac{(n-2)!}{\prod\limits_{i=1}^n a_i-1}\)。

显然必须有 \(\sum\limits_{i=1}^n a_i = 2(n-1) = 2n - 2\),于是 \(\sum\limits_{i=1}^n a_i - 1 = n - 2\),所以相当于是做一个可以重复元素的全排列。


例题

prufer 序列 学习笔记的更多相关文章

  1. prufer序列学习笔记

    prufer序列是一个定义在无根树上的东西. 构造方法是:每次选一个编号最小的叶子结点,把他的父亲的编号加入到序列的最后.然后删掉这个叶节点.直到最后只剩下两个节点,此时得到的序列就是prufer序列 ...

  2. prufer编码学习笔记

    prufer 编码 对于一个无根树,他的 prufer 编码是这样确定的: 每次找到编号最小的一个叶子节点,也就是度数为\(1\)的节点,把和它相连的点,加入 prufer 编码序列的末尾,然后把这个 ...

  3. 树的计数 + prufer序列与Cayley公式 学习笔记

    首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.ne ...

  4. [学习笔记]prufer序列

    前言 PKUWC和NOIWC都考察了prufer序列,结果统统爆零 prufer序列就是有标号生成树对序列的映射 prufer序列生成 每次选择编号最小的叶子删掉,把叶子的父亲加入prufer序列,直 ...

  5. python 学习笔记1(序列;if/for/while;函数;类)

    本系列为一个博客的学习笔记,一部分为我原创. 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 1. print 可以打印 有时需要 ...

  6. python学习笔记(一)元组,序列,字典

    python学习笔记(一)元组,序列,字典

  7. 深度学习中的序列模型演变及学习笔记(含RNN/LSTM/GRU/Seq2Seq/Attention机制)

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![认真看图][认真看图] [补充说明]深度学习中的序列模型已经广泛应用于自然语言处理(例如机器翻 ...

  8. prufer序列笔记

    prufer序列 度娘的定义 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2. 对于一棵确定 ...

  9. Prufer codes与Generalized Cayley's Formula学习笔记

    \(Prufer\)序列 在一棵\(n\)个点带标号无根树里,我们定义这棵树的\(Prufer\)序列为执行以下操作后得到的序列 1.若当前树中只剩下两个节点,退出,否则执行\(2\) 2.令\(u\ ...

随机推荐

  1. window下启动redis服务

    ---恢复内容开始--- 在windows环境下启动redis服务,前提是你安装好了,启动如下: 一,进入redis的安装目录下,在地址栏输入“cmd”,回车 二,然后会进入cmd界面,直接运行命令r ...

  2. jquery.ui.widget.js

  3. .net 4.5 Test Async Task 异步测试

    using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...

  4. linux 下spyder安装

    linux  下spyder安装: 安装qt4,python3 对应qt5 sudo apt-get install libxext6 libxext-dev libqt4-dev libqt4-gu ...

  5. Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)

    应用场景 通常在应用开发中我们会碰到定时任务的需求,比如未付款订单,超过一定时间后,系统自动取消订单并释放占有物品. 许多同学的第一反应就是通过spring的schedule定时任务轮询数据库来实现, ...

  6. Delphi XE2 之 FireMonkey 入门(15) - 滤镜: 获取滤镜信息

    滤镜类的继承关系: TObject -> TPersistent -> TFilter -> TShaderFilter -> { 具体的滤镜类 } //下面例子首先会用到 F ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第1节 Scanner类_3-Scanner的使用步骤

    Scanner如何进行键盘输入,引用类型就包含了Scanner,它就是引用类型,所以也有这三个步骤, 导包.创建.使用 先通过api文档找到它.左边输入要查找scanner.双夹scanner右边就会 ...

  8. UI自动化之特殊处理四(获取元素属性\爬取页面源码\常用断言)

    获取元素属性\爬取页面源码\常用断言,最终目的都是为了验证我们实际结果是否等于预期结果 目录 1.获取元素属性 2.爬取页面源码 3.常用断言 1.获取元素属性 获取title:driver.titl ...

  9. spring源码下载及转入ECLIPSE

    转自:https://www.cnblogs.com/scevecn/p/6043284.html 本例spring源码版本是4.3.0的, 所以jdk需要准备1.8的(不同版本源码要求的jdk不一样 ...

  10. Java-Lambda表达式第一篇认识Lambda表达式

    1.Lambda表达式时Java 8新增的特性.Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码创建只有一个抽象方法的接口(即函数式接口)的实例. 2.当使用Lamb ...