\(Prufer\)序列

\(Prufer\)序列与树的相互转换:

树->\(Prufer\)序列

找到一个编号最小的叶子结点,把这个点删掉并且把跟他连着的那个点的编号加入\(Prufer\)序列。

\(Prufer\)序列->树

设集合\(S={1,\cdots,n}\)
找到一个不在\(Prufer\)序列中且在\(S\)中的数,将它与\(Prufer\)序列中的第一个元素连边,并将这个数和\(Prufer\)序列的第一个元素删掉。
最后\(S\)会剩下最后两个元素,把这两个元素连边。

性质

性质\(1\)

\(Prufer\)序列与无根树一一对应。

性质\(2\)

\(n\)个点有编号的无根树有\(n^{n-2}\)个。
或\(n\)个点的完全图的生成树个数有\(n^{n-2}\)个。

性质\(3\)

度数为\(d\)的点在\(Prufer\)序列中出现\(d-1\)次。

例题

[HNOI2004]树的计数

给定度数\(d_1\sim d_n\),求有多少树。
定理:给定度数\(d_1\sim d_n\)的无根树有\(\frac{(n-2)!}{\prod\limits_{i=1}^n{(d_i-1)!}}\)
证:
\(Prufer\)序列中\(i\)元素出现\(d_i-1\)次。
\(n-2\)个元素的排列有\((n-2)!\)。
然后每一种元素自己内部的排列有\((d_i-1)\)。
相除即可。实际上就是可重排列。

[HNOI2008]明明的烦恼

\(n\)个点给定\(k\)个点的度数\(d_1\sim d_k\),求有多少树。
这题是上一道题的拓展。
我们先设\(s=\sum\limits_{i=1}^k (d_i-1)\)。
在\(Prufer\)序列中这\(k\)个点会出现\(s\)次,这里的方案数为\({n-2}\choose{s}\)。
然后我们考虑这\(k\)个点的排列,跟上一问一样的计算,方案数为\(\frac{s!}{\prod\limits_{i=1}^k (d_i-1)}\)。
最后我们考虑剩下\(n-2-s\)个位置,每个位置可以填\(n-k\)个数中的一个,方案数为\((n-k)^{n-2-s}\)。
所以总的答案就是\({{n-2}\choose{k}}\frac{s!}{\prod\limits_{i=1}^k (d_i-1)}(n-k)^{n-2-s}\)

随机推荐

  1. CF G. Indie Album 广义后缀自动机+树链剖分+线段树合并

    这里给出一个后缀自动机的做法. 假设每次询问 $t$ 在所有 $s$ 中的出现次数,那么这是非常简单的: 直接对 $s$ 构建后缀自动机,随便维护一下 $endpos$ 大小就可以. 然而,想求 $t ...

  2. luoguP2285 [HNOI2004]打鼹鼠 x

    P2285 [HNOI2004]打鼹鼠 题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某 ...

  3. mv:移动文件或改名

    mv 命令(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名.该命令的基本格式如下: mv [选项] 源文件 目标文件 选项: -f:强制覆盖,如果目标文件已经存 ...

  4. C语言写数据库(二)

    简单的实现增删查改的操作后,实现了一个先读写其中一个表的某两项内容,再把相关字符段写入到另外一张表中去.涉及到查询和插入两个步骤. 其中还涉及到汉字的读写和插入,会有字符的操作产生乱码.所以要先保证m ...

  5. python解析字体反爬

    爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用python爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码.这种一般是网站设置了字体反爬 一.58同城 用谷歌浏览器打开 ...

  6. AtCoder4351 Median of Medians 二分, 树状数组

    题目大意 定义一个从小到大的数列的中位数为第 $ \frac{n}{2}+1 $ 项.求一个序列的所有连续子序列的中位数的中位数. $ (n \leqslant 100000)$ 问题分析 由于\(n ...

  7. python学习之路(12)

    迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). 在Python中,迭代是通过for ... in来完成的,而 ...

  8. Linux下kafka集群的搭建

    上一篇日志已经搭建好了zookeeper集群,详细请查看:http://www.cnblogs.com/lianliang/p/6533670.html,接下来继续搭建kafka的集群 1.首先下载k ...

  9. C++入门经典-例4.9-输出不同生命周期的变量值

    1:代码如下: // 4.9.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using ...

  10. 【Spark机器学习速成宝典】基础篇01Windows下spark开发环境搭建+sbt+idea(Scala版)

    注意: spark用2.1.1 scala用2.11.11 材料准备 spark安装包 JDK 8 IDEA开发工具 scala 2.11.8 (注:spark2.1.0环境于scala2.11环境开 ...