【学习笔记】prufer 序列

内容

在一张图上有 n 个节点,可以产生的生成树个数为 nn2

证明

一一对应法。

n个点为:1,2,...n.

假设 T 是其中一棵树,树叶中有标号最小的,设为 a1a1 的临界点为b1

从图中消去 a1 点和边 (a1,b1)b1 点便成为消去后余下的树 T1 的叶子节点。

在树 T1 中继续寻找标号最小的树叶,设为 a2a2 的邻接点为 b2,从 T1 中消去 a2 及边 (a2,b2)

如此步骤共执行 n2 次,直到最后只剩下一条边为止.于是一棵树对应一序列 b

b1,b2,,bn21n 的数,并且允许重复。

反过来从 b 可以恢复树 T 本身,过程:在序列 a 中找出第一个不出现在序列 b 中的数

这个数显然便是 a1,同时形成的边 (a1,b1),并从 a 中消去 a1 ,从 b 中消去b1

在余下的序列中继续以上的步骤 n3 次,直到序列 b 为空集为止。这时序列(1)剩下的两个数ak,bk,边(ak,bk)是树 T 的最后一条边。

上面的过程说明过 n 个已知标号的顶点的树和序列 b1n2 一一对应,所以 n 个有标号(相当于互异)的顶点的树的数目,为 nn2 个.


一个点在 purfer 序列中出现的次数,为其在无根树中的出度的个数 1

这样我们可以把树的计数转化到序列计数

例题

构树

对该问题的解决有非常明显的刻画:dpx,y,z 表示 x 点为根的子树里面有 y 个边被选择保留,根节点所在的联通块大小为 z 的对答案的贡献

这个 DP 配合 prufer 序列就可以完成转移:

m 个大小为 {a1am} 个联通块所形成的树的数量是 i=1mai(ai)m2

上面结论有个简单的证明:考察在一个树的构成方案,每条边的形成方案是连接的两个联通块大小的乘积

那么所有边的贡献相乘则结果为 i=1msizidegi

关注到 prufer 序列中每个点的出现次数是度数减一,求和之余还要再补充一份

那么将 ai=n 分散到每个联通块上面统计,树形 DP 的过程中出现 (x,t) 的边被断掉那么就乘 n 转移

具体形式相对容易,注意减去已经 ban 掉的边在序列里面的贡献,也就是在断开之后边 (x,t) 后 分别包含 (x),(t) 两个联通块连起来的方案要减一

进一步优化考虑观察最后一维必要性,考虑从一堆有标号点里面选一个的方案数是堆的大小,那么 dpx,y,0/1 表示是不是选过点了,转移和上面类似

复杂度和树上背包一致,为 Θ(n2)

指数做法给了非常多分数让暴力选手体验也非常良好

posted @   没学完四大礼包不改名  阅读(324)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示