zoukankan      html  css  js  c++  java
  • prufer序列学习笔记

    prufer序列是一个定义在无根树上的东西。

    构造方法是:每次选一个编号最小的叶子结点,把他的父亲的编号加入到序列的最后。然后删掉这个叶节点。直到最后只剩下两个节点,此时得到的序列就是prufer序列。

    这个构造可以用优先队列做到 $O(nlog n)$。

    至于如何用prufer序列反推出树,也可以用优先队列做到 $O(nlog n)$。一开始将没出现在序列中的点加入优先队列。每次取出队头,将这个点和序列第一个数连边。然后将序列第一个数删掉,同时将不在序列中的数加入优先队列。序列为空时优先队列中一定有两个点,对这两个点再连边即可。


    prufer序列的一些性质:

    1. 一棵 $n$ 个点的无根树prufer序列长度为 $n-2$。
    2. 无根树和prufer序列一一对应,一个无根树唯一对应一个prufer序列,一个prufer序列唯一对应一个无根树。
    3. 一个在树中度数为 $d$ 的点在prufer序列中出现了恰好 $d-1$ 次。

    那么就能推出一些常用结论:

    1. $n$ 个点的无根树(带标号)有 $n^{n-2}$ 棵。(prufer序列长度为 $n-2$,每个位置都可以随便选 $1$ 到 $n$ 的数)
    2. $n$ 个点的度数为 $d_1,d_2cdots,d_n$ 的无根树个数为 $dfrac{(n-2)!}{prod(d_i-1)!}$。因为 $i$ 在prufer序列中会出现 $d_i-1$ 次,最后计算出来就是这个式子。

    一些例题:

    洛谷2290 [HNOI2004]树的计数(题解待填充)

    洛谷2624 [HNOI2008]明明的烦恼(题解待填充)

    洛谷5219 无聊的水题 I(题解待填充)

  • 相关阅读:
    实现类似add(1)(2)(3)的函数
    Chrome安装助手踩坑
    升级webpack4错误处理
    vue项目埋点
    如何理解vue中的v-bind?
    不能不知道的webpack基本配置
    IE9及以下浏览器升级提示
    HTML5常用API
    css中clip属性
    Web开发展望
  • 原文地址:https://www.cnblogs.com/1000Suns/p/10628641.html
Copyright © 2011-2022 走看看