Prufer 序列浅谈

prufer 序列完成了从一棵大小为 n 的无根树到长度为 n2 的序列的双射,下面简述其构造过程:

  • 从一棵无根树到 Prufer 序列:

找到其编号最小的叶子,然后删掉叶子,把其父亲加入队列。重复操作,直到整棵树剩下两个节点。

O(nlogn) 是显然可以做的,考虑如何 O(n)

用一个指针,指向当前编号最小的叶子节点,然后删掉他,如果其父亲变成了叶子,并且编号比它小,我们就删掉其父亲并重复操作,否则往后推指针,找到下一个叶子。

  • 从 Prufer 序列到一棵无根树:

容易发现,每个节点的度数是在 Prufer 序列中的出现次数加 1,现在知道每个点的度数,我们找到编号最小的叶子,然后删掉它,如果其父亲也变成了叶子,并且编号较小,重复这个操作,否则的话,往后推指针,找到下一个叶子。最后会剩下两个点,其中一个节点是 n,我们只需要在 Prufer 序列最后加入 n 就可以避免特判。

所以大小为 n 的有标号无根树数量为 nn2

不过更需要注意的是,上面定义的叶子是不严谨的。
prufer 序列是有标号无根树与长度为 n2 序列的一种双射,由此可以知道有标号无根树的个数为 nn2 个。而所谓的叶子,实际上就是度数为 1 的点。而之所以定义了父亲等,是因为我们假设以 n 为根,而其一定是不会被删掉的。

可以得到比 Cayley 定理(有标号无根树个数的定理)更强的定理,如果给定了 k 个连通块,点的总数为 n ,把这些连通块连成树的方案数应该为:

nk2si

其中 si 表示第 i 个连通块的大小。

考虑如何证明,首先考虑每个连通块都是一个点,设练完边后第 i 个连通块的度数为 di,那么有:

di1,di=2k2(k2d11,d21,,dk1)

然后关注到上面这个式子每一个方案都对应着一棵树,而每个连通块都需要选出一些点来连边,这些点是可以重复选择的,由此可以得到总的方案数应该为:

di1,di=2k2(k2d11,d21,,dk1)sidi

考虑多元二项式定理:

(i=1kxi)n=i=1kdi=n(nd1,d2,,dk)i=1kxidi

所以可以得到原式为:

si(i=1kxi)k2=nk2si

posted @   NuclearReactor  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
主题色彩