zoukankan      html  css  js  c++  java
  • 树的Prufer 编码和最小生成树计数

     
    Prufer数列
      Prufer数列是无根树的一种数列。在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2。它可以通过简单的迭代方法计算出来。它由Heinz Prufer于1918年在证明cayley定理时首次提出。
     

    将树转化成Prufer数列的方法

      一种生成Prufer序列的方法是迭代删点,直到原图仅剩两个点。对于一棵顶点已经经过编号的树T,顶点的编号为{1,2,...,n},在第i步时,移去所有叶子节点(度为1的顶点)中标号最小的顶点和相连的边,并把与它相邻的点的编号加入Prufer序列中,重复以上步骤直到原图仅剩2个顶点。
    例子
    Prufer数列Prufer数列
      以上边的树为例子,首先在所有叶子节点中编号最小的点是2,和它相邻的点的编号是3,将3加入序列并删除编号为2的点。接下来删除的点是4,5被加入序列,然后删除5,1被加入序列,1被删除,3被加入序列,此时原图仅剩两个点(即3和6),Prufer序列构建完成,为{3,5,1,3}

    2将Prufer数列转化成树的方法

      设{a1,a2,..an-2}为一棵有n个节点的树的Prufer序列,另建一个集合G含有元素{1..n},找出集合中最小的未在Prufer序列中出现过的数,将该点与Prufer序列中首项连一条边,并将该点和Prufer序列首项删除,重复操作n-2次,将集合中剩余的两个点之间连边即可。
    例子
      仍为上面的树,Prufer序列为{3,5,1,3},开始时G={1,2,3,4,5,6},未出现的编号最小的点是2,将2和3连边,并删去Prufer序列首项和G中的2。接下来连的边为{4,5},{1,5},{1,3},此时集合G中仅剩3和6,在3和6之间连边,原树恢复。

    1. 一棵标号树的Pufer编码规则如下:找到标号最小的叶子节点,输出与它相邻的节点到prufer 序列, 将该叶子节点删去,反复操作,直至剩余2个节点。

    2. 由Pufer编码生成树:任何一个prufer 序列可以唯一对应到一棵有标号的树,首先标记所有节点为未删除 依次扫描prufer 序列中的数,比如当前扫描到第k个数u,说明有一个叶子节点连到u,并在当前操作中被删除,找一个标号最小的未被标记为删除的且在prufer 序列第k个位置后未出现过的节点v,在u,v间连边并将v删除,反复操作,最后剩两个节点未被标记为删除,在它们之间连边,这样得到的一个图含有n-1条边则是一棵树

    3. 一棵树N个结点,其Profer序列有N-2个位置,因此可以在这N-2个位置里面任何的填充1~N之间的数形成一个prufer序列,且一个prufer序列唯一的对应一颗生成树,于是完全图的最小生成树的数目为N^(N-2)

    推荐做题:pku2567,pku2568

  • 相关阅读:
    Vmware安装CentOS6
    MySQL Explain详解
    数据库——Redis超详细总结
    读书——你的见识决定你的人生
    软件——Ubuntu16.04设置静态ip地址
    软件——Hexo-NexT配置个人博客
    Java——Java实现生产者消费者
    程序员的踩坑经验总结(四):死锁
    程序员的踩坑经验总结(三):内存泄露
    认识自己和世界
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/4472528.html
Copyright © 2011-2022 走看看