prufer序列
Prufer序列的转化方法见这篇博客(这篇文章里这道模板题的高精处理方法也看看,注意特判条件,想想为啥充要)
最后剩两个点的原因就是因为Prufer编码的最后一位是唯一确定的,一定是
这里主要是对这篇博客的一些说明。
首先:为什么Prufer序列与无根树一一对应?
我们要先知道两个引理:出现在Prufer序列中的点一定是原无根树的非叶子节点(这里的叶子节点定义为最开始度数为
第一个引理比较简单,因为非叶子节点根本没有儿子节点让他被添加到Prufer序列中
第二个引理,我们用反证。设某个原无根树的非叶子节点没有被添加到Prufer序列中。
如果这个节点已经被删除了(不是最后剩下的那两个节点中的其中一个),那么在这个节点被删除的时候,它一定只剩了一条边。由于它原来不是叶子节点,所以他最开始的边是多于一条边的,那么这些边任何一个被删除的时候都会把这个点添加到Prufer序列中,矛盾
如果这个节点是最后剩下的两个中的其中一个,那么这个点最后只剩下了一条边,同理,他在删除任何一条边的时候都会被添加到Prufer序列中,矛盾
综上,两个引理得证
对于一个无根树转化成prufer序列的过程中,由于我们每次选择的是最小的节点,所以最终会得到唯一的prufer序列
对于prufer序列还原的时候,文章中说的“点集”指的是还没有被还原的点。注意每次从点集时删除点的时候,相当于在树上还原了一个节点,然后我们按照数学归纳法考虑就好了。在还原的过程中,由于每个点只会被删除一次,所以如果某个点在经过这次还原后已经不再Prufer序列里面了,一定要在非Prufer序列集合里面增加这个点(当然也可以一开始就把所有点加入到一个点集里面,就像文章说的那样)。因为对此时剩下的图来说,这个点已经是叶子节点了
那么我随便写一个Prufer序列一定都是合法的吗?
答案是肯定的。因为Prufer序列的长度是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构