Prufer编码
Prufer
编码
Prufer编码转树
O(n)
时间复杂度
可以把一棵无根树变成一个序列,也可以将一个序列变成一棵无根树。
- 每次找到无根树编号最小的度数为1的点
- 然后将此点的父节点加入序列
O(n)
时间求Prufer
编码
对于一个有n
个节点的树,其prufer
编码只有n-2
个数。
树转Prufer编码
一个数在prufer
编码中出现多少次,就说明其有几个儿子
Step:
void tree2prufer()
的操作是顺序遍历,然后从1开始遍历,当找到出度为0的点时,将其父节点加入prufer
序列,然后递归其父节点,如果其父节点的出度为0且父节点小于当亲遍历到的j的值,父节点的父节点也加入prufer
序列。
void pruffer2tree()
的操作是顺序遍历prufer
序列的同时遍历1~n,如果1~n遍历的时候有出度为0的点,则其父亲就是当前遍历到的prufer
序列,然后prufer
序列当前数的出度—,如果为0且小于当前遍历的树,则其父亲节点为下一个prufer
序列中的树。
一道板子,如果m=1,给出给定树的prufer编码,否则给出给定prufer编码的树
1 | const int N = 1e5+10; |
应用:
Cayley定理
- 对于一个$n$个点的无向完全图,其生成树的个数为$n^{n-2}$
证明:由prufer
编码一共n-2位,每一位有n个选择,因此为$n^{n-2}$