\(Prufer\) 序列

\(\texttt{definition}\)

\(Prufer\) 序列序列可以将一个带标号 \(n\) 个结点的树用 \([1..n]\) 中的 \(n-2\) 个整数表示。你也可以把它理解为完全图的生成树与数列之间的双射。

显然你不会想不开拿这玩意儿去维护树结构。这玩意儿常用组合计数问题上。

\(\texttt{Construction sequence}\)

Prufer 是这样建立的:每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点。重复 \(n-2\) 次后就只剩下两个结点,算法结束。

很容易想到用堆做到 \(O(n\log n)\)

然而可以线性构造

以上摘自 oi-wiki

\(\texttt{nature}\)

  1. 在构造完 \(Prufer\) 序列后原树中会剩下两个结点,其中一个一定是编号最大的点 \(n\) 。
  2. 每个结点在序列中出现的次数是其度数减 \(1\) 。(没有出现的就是叶结点)

\(\texttt{Rebuild the tree}\)

重建树的方法是类似的。根据 \(Prufer\) 序列的性质,我们可以得到原树上每个点的度数。然后你也可以得到度数最小的叶结点编号,而这个结点一定与 \(Prufer\) 序列的第一个数连接。然后我们同时删掉这两个结点的度数。

每次我们选择一个度数为 \(1\) 的最小的结点编号,与当前枚举到的 \(Prufer\) 序列的点连接,然后同时减掉两个点的度。到最后我们剩下两个度数为 \(1\) 的点,其中一个是结点 \(n\) 。就把它们建立连接。使用堆维护这个过程,在减度数的过程中如果发现度数减到 \(1\) 就把这个结点添加到堆中,这样做的复杂度是 \(O(n\log n)\) 的。

同理我们可以线性构造

在删度数的时侯会产生新的叶结点,于是判断这个叶结点与指针 \(p\) 的大小关系,如果更小就优先考虑它

\(\texttt{Gayley's formula}\)

凯莱定理

完全图 \(K_n\) 有 \(n^{n-2}\) 棵生成树。

怎么证明?方法很多,但是用 \(Prufer\) 序列证是很简单的。任意一个长度为 \(n-2\) 的值域 \([1..n]\) 的整数序列都可以通过 \(Prufer\) 序列双射对应一个生成树,于是方案数就是 \(n^{n-2}\) 。

图的联通方案数

大家可以去看上文的链接

一个 \(n\) 个点 \(m\) 条边的带标号无向图有 \(k\) 个连通块。我们希望添加 \(k-1\) 条边使得整个图连通。求方案数。

这里只写出结论 \(ans = n^{k-2}\prod_{i=1}^k s_i\)

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

  1. prufer序列学习笔记

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

  2. prufer 序列 学习笔记

    prufer 序列是一种无根树的序列,对于一个 \(n\) 个点的树,其 prufer 序列的长度为 \(n-2\). prufer 序列和原树之间都可以唯一地相互转化. 构造 构造 prufer 序 ...

  3. prufer编码学习笔记

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

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

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

  5. [学习笔记]prufer序列

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

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

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

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

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

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

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

  9. prufer序列笔记

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

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

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

随机推荐

  1. 集群部署看过来,低代码@AWS智能集群的架构与搭建方案

    为了帮助充分利用AWS的托管服务快速构建起一套集群环境,彻底去掉"单一故障点",实现最高的可用性,我们准备了<低代码智能集群@AWS的架构与搭建方案>看完本文,带你掌握 ...

  2. MySQL进阶实战2,那些年学过的事务

    @ 目录 一.MySQL服务器逻辑架构 二.并发控制 1.读写锁 2.锁粒度 3.表锁 4.行级锁 三.事务 1.原子性(atomicity) 2.一致性(consistency) 3.隔离性(iso ...

  3. 【算法总结】【队列均LinkedList】栈和队列、双端队列的使用及案例

    1.栈 初始化:Stack<E> stack = new Stack<>(); 出栈:stack.pop() 或 stack.remove(stack.size() - 1) ...

  4. 【大数据面试】sqoop:空值、数据一致性、列式存储导出、数据量、数据倾斜

    一.有没有遇到过问题,怎么进行解决的 1.空值问题 本质:hive底层存储空数据使用\n<==>MySQL存储空数据使用null 解决:双向导入均分别使用两个参数☆,之前讲过 2.数据一致 ...

  5. Backbone 网络-ResNet v2 详解

    目录 目录 目录 前言 摘要 1.介绍 2.深度残差网络的分析 3.On the Importance of Identity Skip Connection 4.On the Usage of Ac ...

  6. TCP\UDP协议 socket模块

    目录 传输层主要协议 TCP协议 三次握手 TCP协议反馈机制 四次挥手 洪水攻击 UDP协议 socket模块 socket代码简介 socket.socket() server.bind() se ...

  7. [攻防世界][江苏工匠杯]unseping

    打开靶机对应的url 上来就是代码审计 <?php highlight_file(__FILE__); class ease{ private $method; private $args; f ...

  8. python 小球碰撞游戏

    #小球和挡板要自己找照片,放在一个单独文件夹,音乐也是一样的import pygame pygame.init()#游戏资源加载 a = 700#x轴为700 b = 800#y抽为800 sceee ...

  9. 16、SQL操作JSON字段

    Mysql5.7版本以后提供一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binar ...

  10. DevSecOps 需要知道的十大 K8s 安全风险及建议

    Kubernetes (K8s)是现代云原生世界中的容器管理平台.它实现了灵活.可扩展地开发.部署和管理微服务.K8s 能够与各种云提供商.容器运行时接口.身份验证提供商和可扩展集成点一起工作.然而 ...