前言

\(prufer\)序列应该是一个比较实用的东西。

据\(hl666\)大佬说,一切与度数有关的树上计数问题,都可以用它以及它的性质来解决。

而听说\(ZJOI\)最近特别喜欢出计数题,所以有必要学一学。

转化\(1\):从无根树到\(prefur\)序列

现在,给你一棵树,我们要考虑如何把它变成\(prefur\)序列。

我们需要重复进行以下操作,直至树中只剩下两个点:

  • 找到一个度数为\(1\),且编号最小的点。(其中编号最小保证了后面将会提到的\(prufer\)序列的唯一对应性,同时也方便从\(prufer\)序列转化回无根树)
  • 把这个点的父亲节点加入序列,然后把这个点从树中删除。

然后我们就得到了一个长度为\(n-2\)的序列,这就是\(prufer\)序列。

所以它有什么实际意义呢?

我也不知道。

以上面的图为例,我们可以模拟这一过程如下:

  • 找到\(4\)号节点,将其父结点加入序列,然后将其删去。此时序列:\(\{2\}\)。
  • 找到\(5\)号节点,将其父结点加入序列,然后将其删去。此时序列:\(\{2,3\}\)。
  • 找到\(3\)号节点,将其父结点加入序列,然后将其删去。此时序列:\(\{2,3,1\}\)。
  • 找到\(6\)号节点,将其父结点加入序列,然后将其删去。此时序列:\(\{2,3,1,2\}\)。
  • 找到\(2\)号节点,将其父结点加入序列,然后将其删去。此时序列:\(\{2,3,1,2,1\}\)。

所以,最后得到的\(prufer\)序列就是\(\{2,3,1,2,1\}\)。

转化\(2\):从\(prufer\)序列到无根树

还是以刚才那棵树为例吧,我们要考虑如何把它的\(prefur\)序列变回它本身。

我们需要重复进行以下操作,直至点集中只剩下两个点:(初始化所有点都在点集中)

  • 取出\(prufer\)序列最前面的元素\(x\)。
  • 取出在点集中的、且当前不在\(prufer\)序列中的最小元素\(y\)。(这恰好呼应了前面提到过的选取编号最小的节点)
  • 在\(x,y\)之间连接一条边。(注意前面的取出相当于删除)

最后,我们在点集中剩下的两个点中连一条边。

显然这有\(n-1\)条边,且绝对不会形成环,因此它是一棵树,且就是原树。

以上面的序列为例,我们可以模拟这一过程如下:

  • 取出\(2,4\)连边。此时\(prufer\)序列:\(\{3,1,2,1\}\),点集:\(\{1,2,3,5,6,7\}\)。
  • 取出\(3,5\)连边。此时\(prufer\)序列:\(\{1,2,1\}\),点集:\(\{1,2,3,6,7\}\)。
  • 取出\(1,3\)连边。此时\(prufer\)序列:\(\{2,1\}\),点集:\(\{1,2,6,7\}\)。
  • 取出\(2,6\)连边。此时\(prufer\)序列:\(\{1\}\),点集:\(\{1,2,7\}\)。
  • 取出\(1,2\)连边。此时\(prufer\)序列:\(\{\}\),点集:\(\{1,7\}\)。

最后再在\(1,7\)间连边,就可以得到原树了。

\(prufer\)序列的性质及相关结论

讲了这么多,我们最关键的还是\(prufer\)序列的一些性质,以及与其有关的一些结论。(毕竟前面也提到过,我也不知道这东西有什么实际意义

  • 重要性质:\(prufer\)序列与无根树一一对应。

    这应该显然吧,通过前面的介绍应该可以直接得出。

    而由这个性质,我们才能推导出后面的结论。

  • 度数为\(d_i\)的节点会在\(prufer\)序列中出现\(d_i-1\)次

    当某个节点度数为\(1\)时,会直接被删掉,否则每少掉一个相邻的节点,它就会在序列中出现\(1\)次。

    因此共出现\(d_i-1\)次。

  • 一个\(n\)个节点的完全图的生成树个数为\(n^{n-2}\)。

    对于一个\(n\)个点的无根树,它的\(prufer\)序列长为\(n-2\),而每个位置有\(n\)种可能性,因此可能的\(prufer\)序列有\(n^{n-2}\)种。

    又由于\(prufer\)序列与无根树一一对应,因此生成树个数应与\(prufer\)序列种树相同,即\(n^{n-2}\)。

  • 对于给定度数为\(d_{1\sim n}\)的一棵无根树共有\(\frac{(n-2)!}{\prod_{i=1}^n(d_i-1)!}\)种情况

    由上面的性质可以知道,度数为\(d_i\)的节点会在\(prufer\)序列中出现\(d_i-1\)次。

    则就是要求出\(d_i-1\)个\(i(1\le i\le n)\)的全排列个数。

    而上面那个式子就是可重全排列公式。(即全排列个数除以重复元素内部的全排列个数

大致就是这些。

例题

下面有两道例题:【洛谷2290】[HNOI2004] 树的计数【洛谷2624】[HNOI2008] 明明的烦恼

实际上,这两道题都只用了由\(prufer\)序列所推导得到的结论,而没有真正构造\(prufer\)序列,应该也不算特别好的例题。。。

初识prufer序列的更多相关文章

  1. bzoj 1005 1211 prufer序列总结

    两道题目大意都是根据每个点的度数来构建一棵无根树来确定有多少种构建方法 这里构建无根树要用到的是prufer序列的知识 先很无耻地抄袭了一段百度百科中的prufer序列的知识: 将树转化成Prufer ...

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

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

  3. [BZOJ1211][HNOI2004]树的计数(Prufer序列)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1211 分析: 关于无根树的组合数学问题肯定想到Prufer序列,类似bzoj1005那 ...

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

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

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

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

  6. prufer序列笔记

    prufer序列 度娘的定义 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2. 对于一棵确定 ...

  7. BZOJ1430小猴打架——prufer序列

    题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架 的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森林的小猴都会 ...

  8. 【XSY2519】神经元 prufer序列 DP

    题目描述 有\(n\)点,每个点有度数限制,\(\forall i(1\leq i\leq n)\),让你选出\(i\)个点,再构造一棵生成树,要求每个点的度数不超过度数限制.问你有多少种方案. \( ...

  9. prufer序列

    介绍 其实是\(pr\ddot{u}fer\)序列 什么是prufer序列? 我们认为度数为\(1\)的点是叶子节点 有一颗无根树,每次选出编号最小的叶子节点,加到当前prufer序列的后面,然后删掉 ...

随机推荐

  1. PIE SDK过滤控制

    1.  功能简介 栅格数据前置过滤是在渲染之前对内存中的数据根据特定的规则进行处理,然后再进行数据渲染.本示例以定标为例进行示例代码编写. 定标(校准)是将遥感器所得的测量值变换为绝对亮度或变换为与地 ...

  2. 转 How To Stop A Running Job Using DBMS_JOB

    There is no procedure within the dbms_job package to stop a running job.You will need to determine w ...

  3. curl -w函数

    url_effective 最终获取的url地址,尤其是当你指定给curl的地址存在301跳转,且通过-L继续追踪的情形. http_code http状态码,如200成功,301转向,404未找到, ...

  4. OJ (Online Judge)使用

    这是一种方式,我们还可使用另外一种方式: process.stdin.resume(); process.stdin.setEncoding('ascii'); var input = "& ...

  5. Ace教你一步一步做Android新闻客户端(三) JSON数据解析

    对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,现在给大家讲解一下json这个知识点, 1 如何通过json-lib和gson这两个json解析库来对解析我们的j ...

  6. 通过c++ 读写文本文件的中文乱码的解决方法

    前提:VS2010 ,MFC ,文本文件为ANSI格式. 读文件: CString str,fileContent;CStdioFile myFile, File;if(myFile.Open(Gen ...

  7. mysql安装 2018最新安装mysql教程及遇到的问题解决Windows下

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8094659.html 今天因为换了个LINUX系统 把我的E盘不小心给卸载了 结果还是不能用 ...

  8. 【LDAP】ldap目录服务的命名模型

    ldap的命名模型 命名模型规定了在目录中如何组织和表示条目 1.   目录信息树(DIT) 目录信息树有点类似于DNS的结构.每一个条目都有自己的父条目(因为主条目的父条目是top,所以这句话是成立 ...

  9. rsync的配置

    1. 安装rsync,如果要讲1.1.1.1的数据备份到2.2.2.2上,则在1.1.1.1上配置如下: /etc/rsyncd.conf uid = nobody gid = nobody use ...

  10. 【linux相识相知】sed命令

    在之前的博客中我们介绍了文本三剑客中grep,本次博客就另外一名剑客——sed做出详细的描述,sed真的是一款强大的工具.下面让我们来一起看一下吧! 概述和工作机制 SED的英文全称为Stream E ...