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


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

结果今天老师留的题中有两道这种的: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

树的计数 Prufer序列+Cayley公式的更多相关文章

  1. 树的计数 + prufer序列与Cayley公式(转载)

    原文出处:https://www.cnblogs.com/dirge/p/5503289.html 树的计数 + prufer序列与Cayley公式 学习笔记(转载) 首先是 Martrix67 的博 ...

  2. 树的计数 + prufer序列与Cayley公式 学习笔记

    首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.ne ...

  3. Luogu P2290 [HNOI2004]树的计数 Prufer序列+组合数

    最近碰了$prufer$ 序列和组合数..于是老师留了一道题:P2624 [HNOI2008]明明的烦恼 qwq要用高精... 于是我们有了弱化版:P2290 [HNOI2004]树的计数(考一样的可 ...

  4. BZOJ 1211 HNOI2004 树的计数 Prufer序列

    题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后 ...

  5. 【BZOJ1005/1211】[HNOI2008]明明的烦恼/[HNOI2004]树的计数 Prufer序列+高精度

    [BZOJ1005][HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可 ...

  6. 【BZOJ1211】【HNOI2004】树的计数 prufer序列

    题目描述 给你\(n\)和\(n\)个点的度数,问你有多少个满足度数要求的生成树. 无解输出\(0\).保证答案不超过\({10}^{17}\). \(n\leq 150\) 题解 考虑prufer序 ...

  7. bzoj1211: [HNOI2004]树的计数 prufer序列裸题

    一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di ...

  8. BZOJ1211: [HNOI2004]树的计数(prufer序列)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2987  Solved: 1111[Submit][Status][Discuss] Descript ...

  9. [HNOI2004] 树的计数 - prufer序列

    给定树每个节点的 degree,问满足条件的树的数目. \(n\leq 150, ans \leq 10^{17}\) Solution 注意特判各种坑点 \(\sum d_i - 1 = n-2\) ...

随机推荐

  1. 脚本手动执行正常,放cron中执行有问题的原因

    问题原因:   1. crond服务没启动   2. 环境变量如 PATH LANG SHELL 等设置不对   3. 脚本中引用的文件地址是相对路径,而非绝对路径.   排查步骤:  以 check ...

  2. CF 293E Close Vertices——点分治

    题目:http://codeforces.com/contest/293/problem/E 仍旧是点分治.用容斥,w的限制用排序+两个指针解决, l 的限制就用树状数组.有0的话就都+1,相对大小不 ...

  3. MyEclipse、Eclipse SVN插件的帐号、密码修改

    问题描述: Eclipse的SVN插件Subclipse做得很好,在svn操作方面提供了很强大丰富的功能.但到目前为止,该插件对svn用户的概念极为淡薄,不但不能方便地切换用户,而且一旦用户的帐号.密 ...

  4. 接口Comparator和Comparable的区别和联系

    1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的. 什么是自定义class: 如 public class Pe ...

  5. JSP介绍(4)--- JSP 过滤器

    过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理这些响应. 过滤器通过 Web 部署描述符 ...

  6. SpringBoot系列(1)

    简介:用来简化新Spring应用的初始搭建以及开发过程:该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 特点:1. 创建独立的Spring应用程序2. 嵌入的Tomcat, ...

  7. paramiko使用1

  8. linux 安装输入法

    简述 Ubuntu16.04安装完后,和12.04以及14.04都不一样,并没有中文输入功能.于是搜索一些安装中文输入法的方法. 开始安装了ibus pinyin输入法,但是系统重启之后发现有些时候不 ...

  9. SpringBoot02 Controller的使用、数据库操作、事物管理、修改banner

    1 Controller的使用 特点:编程技巧和SpringMVC几乎完全一样 注意:@RestController = @Controller + @ResponseBody 注意:读取路径参数和请 ...

  10. HTable基本概念

    出处:http://www.taobaotest.com/blogs/1582 引言 团队中使用HBase的项目多了起来,对于业务人员而言,通常并不需要从头搭建.维护一套HBase的集群环境,对于其架 ...