树的prufer编码
注意:
- 高精度!
实现树的Prufer编码
Prufer 编码是用另外一种形式来描述一棵树,这棵树是无根树,它可以和无根树之间形成一一对应关系。
已知树,如何求 Prufer 编码?
首先选这棵树叶子中编号最小的点,将这个点删除,并且把它的邻接点加入一个数组中,例如第一个删除的节点为
删除节点后形成一棵新的树,再在新树中删除最小的节点,并且把邻接点加入数组中,这样重复以上步骤,直到树中最后剩余两个点的时候终止操作。
这时候数组中的便是 Prufer 编码。
例如上图是一棵无根树,这棵树的 Prufer 编码为
将 Prufer 编码还原为一棵树
假如 Prufer 编码为
然后取不在数组中的最小值为
Prufer 编码的性质
Cayley 定理:不同的
任意一棵
度数为
例题:[HNOI2008]明明的烦恼
题目描述
自从明明学了树的结构,就对奇怪的树产生了兴趣…… 给出标号为
输入格式
第一行为-1
。
输出格式
一个整数,表示不同的满足要求的树的个数,无解输出 0
。
输入
31-1-1
输出
2
说明/提示
两棵树分别为 1-2-3; 1-3-2
题目分析
该题需要将树转化为 prufer 编码:
则有度数的点出现次数为:
因为度数为
所以要求在
在
插第二个节点的方法有
……
另外还有
根据乘法原理:
然后就要高精度了……但高精度除法太麻烦了,显而易见的排列组合一定是整数,所以可以进行质因数分解,再做一下相加减。
关于
若
且
代码详见 Code