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


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

结果今天老师留的题中有两道这种的: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. 线段树_区间加乘(洛谷P3373模板)

    题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字 ...

  2. loj515贪心只能过样例

    bitset练习题... 位运算真的是玄学... 一开始真的“只能过样例” 后来发现把左移写成了小于号 鬼知道我在想什么/手动微笑 loj第一题 #include<iostream> #i ...

  3. Java 处理批量数据提交

    在Java web开发过程中,处理表单数据是很重要一部分,常见的是form post处理单条数据的,但也会遇到一次提交多条数据到服务器的,如下:

  4. oracle rac的特征

    oracle rac的特征 1. spfile 参数文件需要被所有节点访问,需要放在共享存储上. 2. Redo ThreadRAC 环境下有多个实例,每个实例都需要有自己的一套Redo log 文件 ...

  5. centos下升级mysql5.5.47到5.7.14操作过程

    一. 查看已安装Mysql基础信息通过mysql –V 查看下mysql版本可以通过命令find / -name mysql 得到下面信息 1.安装目录[root@jjxnhd-192-10 mysq ...

  6. grep的用法(转)

    grep参数 -c  : 显示匹配的行数(就是显示有多少行匹配了): -n :显示匹配内容所在文档的行号: -i  :匹配时忽略大小写: -s :错误信息不输出: -v :输出不匹配内容: -o : ...

  7. Spring 3.1新特性之四:p命名空间设置注入(待补充)

    https://www.ibm.com/developerworks/cn/java/j-lo-jparelated/ http://www.ibm.com/developerworks/cn/jav ...

  8. jQuery对象和DOM对象的互换

    Dom 对象:指的是普通的 JavaScript 对象 jQuery对象:是包装 Dom 对象后产生的对象. 一:JQuery 对象和 Dom 对象 在使用 JQuery 过程中,我们一般(也是绝大多 ...

  9. SpringSecurity03 基于内存验证

    1 需求 现有一个编写好的系统,需要实现用户登录验证即可,同时根据用户的权限来限制用户可以访问的接口 2 编写SpringSecurity配置类 继承 WebSecurityConfigurerAda ...

  10. 利用Admin-LTE项目搭建自己前端的开发框架模板

    1 完整版本 1.1 下载admin-lte项目源代码 github下载地址:点击前往 三少云盘地址:点击前往 1.2 查看admin-lte精简主页源代码 页面地址:点击前往 注意:由源代码可以知道 ...