2419. prufer序列
题目链接
2419. prufer序列
本题需要你实现prufer序列与无根树之间的相互转化。
假设本题涉及的无根树共有 个节点,编号 。
为了更加简单明了的描述无根树的结构,我们不妨在输入和输出时将该无根树描述为一个以 号节点为根的有根树。
这样就可以设这棵无根树的父亲序列为 ,其中 表示将该树看作以 号节点为根的有根树时, 号节点的父节点编号。
同时,设这棵无根树的prufer序列为 。
现在,给定一棵由 个节点构成的无根树,以及该无根树的一个序列(父亲序列或prufer序列),请你求出另一个序列。
输入格式
输入共两行。
第一行包含两个整数 ,表示无根树的节点数以及给定序列类型。
如果 ,则第二行包含 个整数,表示给定序列为父亲序列。
如果 ,则第二行包含 个整数,表示给定序列为prufer序列。
输出格式
共一行,输出另一个序列,整数之间用单个空格隔开。
数据范围
输入样例1:
输出样例1:
输入样例2:
输出样例2:
解题思路
prufer编码
prufer编码主要作用即将一棵无根树转化为一个序列(即prufer序列),另外prufer序列也可以反过来转化为一棵树,即prufer序列和树之间是一一对应的,常用来解决一些证明问题,如凯莱定理等
证明凯莱定理(一个无向完全图有 棵生成树):由于prufer序列和树之间是一一对应的关系,证明有多少棵不同的生成树即证明有多少种prufer序列,显然,prufer序列共有 项,其范围为 ,故其种类数为
prufer编码的流程:假定 号节点为根,找到除根外度数最小的节点,在删除该节点之前,将其父节点输出,重复该流程,直到最后只剩下两个节点,即prufer序列只有 个元素,因为prufer序列最多 个元素,而最后一个元素一定为 ,所以这个元素可以省略,输出的元素即为prufer序列
假定当前出度为 且编号最小的节点为 ,则输出 ,删除 之后,出度为 的节点至多只会增加一个,即 ,判断删除 之后 的出度是否为 ,如果 的出度为 且 说明 是当前出度为 且编号最小的节点,递归输出这样的父节点即可,否则说明这样的 只会更大,即 只会增加,这样即可线性时间内将一颗树转化为prufer序列
先将 这个节点加入到prufer序列中,不难发现,prufer序列中某个数出现的次数即为该数在树中的儿子节点的数量,从 开始找到儿子数量为 且编号最小的节点 ,其父节点即为当前遍历的prufer序列的元素,将该元素从prufer序列中删去,因为删除该元素后儿子数量为 的节点数量至多直接增加一个,如果该元素的儿子数量为 且编号小于 ,说明当前节点即为儿子数量为 且编号最小的节点,递归处理即可,这样的 同样也是递增的,故可以在线性时间内将一个prufer序列转化为一棵树
- 时间复杂度:
代码
__EOF__

本文链接:https://www.cnblogs.com/zyyun/p/16951582.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!