Prufer 序列
Prufer 序列可以将一个带标号个节点的树用中的个整数表示,即个点的完全图的生成树与长度为值域为的数列构成的双射。
Prufer 序列可以方便的解决一类树相关的计数问题,比如凯莱定理:个点的完全图的生成树有 个。注意这是定根树或无根树,根不定还要
对树构造 Prufer 序列
Prufer 是这样构造的:
每次选择一个编号最小的叶节点并删掉它,然后在序列中记录下它连接到的那个节点。
重复次后就只剩下两个节点,算法结束。
显然,使用堆可以做到的复杂度。
使用一个指针代替堆找最小值,可以做到 的复杂度。
具体而言,指针指向编号最小的叶节点。每次删掉它之后,如果产生了新的叶节点且编号比指针指向的更小,则直接继续删掉,否则自增找到下一个编号最小的叶节点。
Prufer 序列的性质
从上述构造 Prufer 序列的过程可以看出 Prufer 序列具有以下两个性质:
- 在构造完 Prufer 序列后原树中会剩下两个节点,其中一个一定是编号最大的点 。
- 每个节点在序列中出现的次数是其度数减 1,因此没有出现的就是叶节点。
用 Prufer 序列构造树
根据 Prufer 序列的性质,我们可以得到原树上每个点的度数。
每次我们选择一个编号最小的度数为 1 的节点,与当前枚举到的 Prufer 序列的点连接,然后同时减掉两个点的度数。重复 次后就只剩下两个度数为 1 的节点,其中一个是,把它们连接起来即可。
同样地,显然,使用堆可以做到 的复杂度。
类似地,使用一个指针代替堆找最小值,可以做到 的复杂度。
具体而言,指针指向编号最小的度数为 1 的节点。每次将它与当前枚举到的 Prufer 序列的点连接之后,如果产生了新的度数为 1 的节点且编号比指针指向的更小,则直接继续将它与下一个 Prufer 序列的点连接,否则自增找到下一个编号最小的度数为 1 的节点。
------摘自洛谷大佬
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效