• Prufer编码


    Prufer编码

    1.概念

    给定一棵带标号的无根树,找出编号最小的叶子结点,写下与它相邻的节点的编号,然后删掉这个叶子结点。反复执行这个操作直到只剩两个节点为止。由于节点数(n>2)的树总存在叶子节点,因此一棵(n)个节点的无根树唯一对应了一个长度为(n - 2)的数列,数列中的每个数都在(1)(n)的范围内。

    将Prufer序列中第一个数与没有出现在Prufer序列中的第一个数连边;之后按次序依次将第(2,3,…,n - 2)个数与其对应的未出现在Prufer序列中的第(2,3,…,n - 2)个数连边;最后剩下两个点直接连边。这样就重新构建出来了原来的无根树。

    这样每一棵(n)个节点的无根树唯一的对应了一个(n - 2)长度的数列,数列中的每个数都在(1)(n)的范围内。

    2.性质

    1. 易得(n)个点的无向完全图的生成树计数((n)个点的有标号无根树的计数)为(n^{n-2})
    2. Prufer序列中某个编号出现的次数等于此编号节点在树中的度数减一。
    3. (n)个节点,每个节点的度数分别为(D_{1}, D_{2}, …,D_{n}),此时无根树的个数为(dfrac{(n - 2) !}{[(D_{1} - 1)! (D_{2} - 1)!…(D_{n} - 1)!]})个,因为此时Prufer编码中的编号(i)出现了(D_{i} - 1)次。(即(n - 2)个元素,各不相同,其中第(i)种元素有(D_{i} - 1)个,求排列数)(例题:洛谷P2290
    4. 与上问条件相同,另有(m)个节点度数未知。设(left = (n - 2) - (D_{1} - 1) - (D_{2} - 1) - … - (D_{n} - 1)),则已知节点可能组合方式为(dfrac{(n - 2) !}{[(D_{1} - 1)! (D_{2} - 1)!…(D_{n} - 1)!] cdot left}),剩余(left)个位置由(m)个未知度数的节点自由填补,方案数为(m^{left})。所以答案为(dfrac{(n - 2) !}{[(D_{1} - 1)! (D_{2} - 1)!…(D_{n} - 1)!] cdot left} imes m^{left})。(例题:洛谷P2624(因为有高精所以没写)
  • 相关阅读:
    php数组操作
    DedeCMS栏目页调用当前栏目名和上级栏目名
    ThinkPHP递归删除栏目
    WebUploader
    js中的事件委托或是事件代理
    thinkphp框架if标签条件表达式
    sublime插件安装
    thinkphp分页
    织梦自定义变量使用
    php foreach用法和实例
  • 原文地址:https://www.cnblogs.com/manziqi/p/9581155.html
Copyright © 2020-2023  润新知