【学习笔记】prufer 序列

内容

在一张图上有 \(n\) 个节点,可以产生的生成树个数为 \(n^{n-2}\)

证明

一一对应法。

\(n\)个点为:\(1,2,... n\).

假设 \(T\) 是其中一棵树,树叶中有标号最小的,设为 \(a_1\)\(a_1\) 的临界点为\(b_1\)

从图中消去 \(a_1\) 点和边 \((a_1,b_1)\)\(b_1\) 点便成为消去后余下的树 \(T_1\) 的叶子节点。

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

如此步骤共执行 \(n-2\) 次,直到最后只剩下一条边为止.于是一棵树对应一序列 $ b$

\(b_1,b_2,⋯,b_{n-2}\)\(1\)\(n\) 的数,并且允许重复。

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

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

在余下的序列中继续以上的步骤 \(n-3\) 次,直到序列 \(b\) 为空集为止。这时序列(1)剩下的两个数\(a_ k,b_k\),边\((a_k,b_k)\)是树 \(T\) 的最后一条边。

上面的过程说明过 \(n\) 个已知标号的顶点的树和序列 \({b_{1 \rightarrow n-2}}\) 一一对应,所以 \(n\) 个有标号(相当于互异)的顶点的树的数目,为 \(n^{n-2}\) 个.


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

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

例题

构树

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

这个 \(\rm{DP}\) 配合 \(prufer\) 序列就可以完成转移:

\(m\) 个大小为 \(\{a_1\dots a_m\}\) 个联通块所形成的树的数量是 \(\prod \limits_ {i=1}^ma_i(\sum a_i)^{m-2}\)

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

那么所有边的贡献相乘则结果为 \(\prod_{i=1}^m siz_i^{deg_i}\)

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

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

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

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

复杂度和树上背包一致,为 \(\Theta(n^2)\)

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

posted @ 2020-03-01 13:30  yspm  阅读(317)  评论(0编辑  收藏  举报