先安利一发。让我秒懂。。


第一次讲这个是在寒假。。。然而当时秦神太巨了导致我这个蒟蒻自闭+颓废。。。早就忘了这个东西了。。。

结果今天老师留的题中有两道这种的:Luogu P4981 P4430

然后决定了解一下。。。

一.Prufer序列

Prufer序列,可以用来解一些关于无根树计数的问题。

Prufer序列是一种无根树的编码表示,对于一棵n个节点带编号的无根树,对应唯一一串长度为n-1的Prufer编码,这性质很好。

1.无根树转化为Prufer序列

首先定义无根树中度数为1的节点是叶子节点(显然)

找到编号最小的叶节点,删除这个节点,然后与这个叶节点相连的点计入序列,直到这棵树只剩下两个节点,一条边

如下图的树对应的Prufer序列就是3,5,1,3

具体实现可以用一个set搞定,维护度数为1的节点。复杂度O(nlogn)。

2.Prufer序列转化为无根树。

设点集V={1,2,3,...,n},每次取出Prufer序列中最前面的元素u,在V中找到编号最小的没有在Prufer序列中出现的元素v,给u,v连边然后从序列中删除v,最后在V中剩下两个节点,给它们连边。最终得到的就是无根树。

具体实现也可以用一个set,维护Prufer序列中没有出现的编号。复杂度O(nlogn)。

最后有一个很重要的性质就是Prufer序列中某个编号出现的次数就等于这个编号的节点在无根树中的度数-1。

还如果不清楚,看下面(以下引用来自朝拜明天19891101)

第一部分:树编码成Prufer序列。

树编码成Prufer序列的方式是:Prufer序列初始为空。每次从树上选出一个编号最小的叶子节点,然后将与该叶子节点相邻的那个节点的编号写入Prufer序列的末尾,之后从树上删掉这个叶子节点。循环这个步骤n-2次,最后得到一个长度为n-2的Prufer序列(此时树中只有一条边,我们就不管它了)。

我们以下面这个树为例。

step1:编号最小的叶子节点为3,将与其相连的节点1加到Prufer的末尾,并将3从树上删掉,此时Prufer序列为(1),树变为如下:

step2:编号最小的叶子节点为1,将与其相连的节点2加到Prufer末尾,此时Prufer序列为(1,2),并将节点1删掉,树变为如下:

step3:编号最小的叶子节点为4,将与其相连的节点2加入到Prufer的末尾,此时Prufer序列为(1,2,2),并将节点4删掉,树变为如下:

此时,结束,我们得到了Prufer序列为(1,2,2)。

第二部分:由Prufer序列得到树。首先,将每个节点的度数设为1加上该节点在Prufer序列中出现的次数。然后以下循环执行n-2次。第i次循环,选择此时度数为1的编号最小的节点u,将其与此时Prufer序列的第i个元素v连边,然后将u和v的度数都减去1。这n-2次执行完之后,仅剩下两个节点他们的度数都是1,将这两个点连边,这样就得到一个有n-1条边的树。

下面,我们以上面的Prufer序列为例还原这个树。初始的Prufer为(1,2,2),初始的度数为:

step1:选择度数为1的最小编号的节点3与Prufer的第一个元素1连边,并将3和1的度数都减去1,得到树和新的度数:

step2:选择度数为1的最小节点1和Prufer中的第二个元素2连边,并将1和2的度数都减去1,得到树和新的度数:


step3:选择度数为1的最小节点4和Prufer中的第三个元素2连边,并将4和2的度数都减去1,得到树和新的度数:

最后,将仅有的度数为1的两个节点2和5,连边,得到:

那么,我们知道这些有什么用呢?看下面

二.Cayley公式

Cayley公式是说,一个无向完全图有n^(n-2)棵生成树,通俗的说就是n个节点的带编号的无根树有n^(n-2)个。

刚才Prufer有一个很重要的性质:序列与树是一一对应的

而Prufer序列有n-2项,序列中的每个数都在1到n的范围内。

所以我们可以直接推出n个点的无向完全图的生成树的计数:n^(n-2)

一个有趣的推广是,n个节点的度依次为D1, D2, …, Dn的无根树共有   (n-2)! / [ (D1-1)!(D2-1)!..(Dn-1)! ]  个,因为此时Prüfer编码中的数字i恰好出现Di-1次(上面的结论)。

下面的结论都看不懂,先咕着:(链接)

3)n个节点的度依次为D1, D2, …, Dn,令有m个节点度数未知,求有多少种生成树?(BZOJ1005 明明的烦恼)

令每个已知度数的节点的度数为di,有n个节点,m个节点未知度数,left=(n-2)-(d1-1)-(d2-1)-...-(dk-1)

已知度数的节点可能的组合方式如下

(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left!

剩余left个位置由未知度数的节点随意填补,方案数为m^left

于是最后有

ans=(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left! * m^left

待填之坑:无标号无根树、有标号有根树、无标号有根树的计数。

参见论文 华中师大一附中 赵爽《树的计数》、南京师范大学附属中学 顾昱洲《Graphical Enumeration》

n个点的 有标号有根树的计数:n^(n-2)*n = n^(n-1)

n个点的 无标号有根树的计数:

n个点的 无标号无根树的计数:an为 n个点的 无标号有根树的计数。

待填之坑:度数有限制时的计数。如烷烃的计数,每个点的度数最大为4。


2019.05.06

转载于:https://www.cnblogs.com/Jackpei/p/10827653.html

[笔记]树的计数 Prufer序列+Cayley公式相关推荐

  1. bzoj1211 [HNOI2004]树的计数 prufer序列+组合数

    如果独自去想出prufer序列实在太难了 所以就只能直接用结论,把树转成prufer序列后这棵树和prufer序列是一一对应的关系 树->prufer序列:每次找到所有叶子结点中编号最小的,删掉 ...

  2. 【XSY1295】calc n个点n条边无向连通图计数 prufer序列

    题目大意 求\(n\)个点\(n\)条边的无向连通图的个数 \(n\leq 5000\) 题解 显然是一个环上有很多外向树. 首先有一个东西:\(n\)个点选\(k\)个点作为树的根的生成森林个数为: ...

  3. BZOJ 1211: [HNOI2004]树的计数 purfer序列

    1211: [HNOI2004]树的计数 Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给 ...

  4. 最小生成树、矩阵树定理、Prufer序列总结

    Kruskal算法 按边权排序,从小到大合并不在同一集合两点即可 Prim算法 每次加入一个到当前已选点集最近的点 P2619 [国家集训队]Tree I 考虑二分,每次给白边加上一个mid,通过这种 ...

  5. BZOJ 1211 树的计数(purfer序列)

    首先考虑无解的情况, 根据purfer序列,当dee[i]=0并且n!=1的时候,必然无解.否则为1. 且sum(dee[i]-1)!=n-2也必然无解. 剩下的使用排列组合即可推出公式.需要注意的是 ...

  6. 模板:Prufer序列

    所谓 Prufer 序列,就是 Prufer 发明的序列. (逃) 前言 优雅的神奇魔术. 看名字很高大难,但实际上是高大清(小清新). 很简单的建立起树与序列之间的双射,且这个序列的性质非常良好,且 ...

  7. 【学习笔记】树的计数,prufer(Prüfer)编码,Cayley公式及相应例题

    目录 1.pruferpruferprufer编码 1)无根树转化为prufer序列 2)prufer序列转化为无根树. 2.Cayley公式 1)由Cayley公式得到四个推论 例题1.P4981 ...

  8. 树的计数 Prüfer编码与Cayley公式 学习笔记

    最近学习了Prüfer编码与Cayley公式,这两个强力的工具一般用于解决树的计数问题.现在博主只能学到浅层的内容,只会用不会证明. 推荐博客:https://blog.csdn.net/moreja ...

  9. 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  10. bzoj1211: prufer序列 | [HNOI2004]树的计数

    题目大意: 告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树 这里注意数量为0的情况,就是 当 n=1时,节点度数>0 n>1时,所有节点度数相加-n!=n-2 可以通 ...

最新文章

  1. SecureCRT设置背景颜色和目录(文件夹)颜色
  2. Asp.NET Core一个接口的多个实现如何基于当前HTTP请求注册
  3. 我的IntelliJ IDEA一直都是这么设置的,效果很棒!
  4. 20145238-荆玉茗 《网络对抗》免杀原理与实践
  5. [转]六步使用ICallbackEventHandler实现无刷新回调
  6. 山西好点的计算机专科学校排名及分数线,2019-2020山西专科学校排名及分数线(理科+文科)...
  7. python列表去重_python列表的去重
  8. linux tcp 113错误,linux系统报tcp_mark_head_lost错误的处理方法
  9. kafka zookeeper docker容器互联
  10. 【Ubuntu系统下百度Apollo7.0与LGSVL2021.3联合教程(亲测有效)】
  11. 谷歌软件工程师是怎样写设计文档的?
  12. 聊一聊:苹果发布新款M2 MacBook Air,macOS 13上线
  13. Spring 测试运行的时候提示 Unable to find a @SpringBootConfiguration 错误
  14. Linux: 关于 SIGCHLD 的更多细节
  15. NEXTCHIP,北京冠宇铭通科技,祝中国人民早日战胜新冠病毒疫情
  16. c#winform使用EntityFramework导入数据库
  17. excel VBA快递查询
  18. 【畅购商城】用户登录
  19. 教你四个步骤在Word中设计毕业论文目录
  20. cad在布局怎么调比例_CAD中怎么在布局里设置不同的比例出图

热门文章

  1. 通过http网页链接下载单词音频文件
  2. 黑马程序员—选择黑马,是我前进的方向
  3. oracle去空格和换行,ORACLE 中去回车、空格、TAB的函数
  4. Expandable Button
  5. lisp ssget 浩辰_ssget 详解
  6. Redis Key 过期事件监听
  7. JTT1078 + netty + rtmp
  8. 远程控制办公室电脑在家远程连接办公室电脑进行办公
  9. win10红警2黑屏_在windows 10中完美的运行《命令与征服·红色警戒2+尤里的复仇资料片...
  10. 环比和同比的定义和应用