目录
具体的内容见:https://www.luogu.com.cn/blog/TheLostWeak/solution-p2290
我花了半个小时写完了以后后忘记保存直接关掉了,然后就没有然后了…已经不想更新了…
1、 p r u f e r prufer prufer编码
首先引入 p r u f e r prufer prufer编码(其实是 P r u ¨ f e r Prüfer Pru¨fer)
p r u f e r prufer prufer数列,可以用来解一些关于无根树计数的问题。
p r u f e r prufer prufer数列是一种无根树的编码表示,对于一 棵 n n n 个节点带编号的无根树,对应唯一一串长度为n-1的 p r u f e r prufer prufer编码。
1)无根树转化为prufer序列
一棵无根树的 p r u f e r prufer prufer编码的值运算如下:
首先定义无根树中度数为1的节点是叶子节点。 找到编号最小的叶子并删除,序列中添加与之相连的节点编号,重复执行直到只剩下2个节点。
如图:
它的 p r u f e r prufer prufer编码就是4, 3, 3
先丢1,4加入序列,再丢2,3加入序列,再丢5,3加入序列,剩余两个,停止丢人,序列为4,3,3
显然,一棵有n个结点的无根树,它的 p r u f e r prufer prufer 编码是唯一的,且有 n − 2 n-2 n−2 个可能相同的元素。
具体实现可以用一个 s e t set set搞定,维护度数为 1 1 1 的节点。复杂度 O ( n l o g n ) O(nlogn) O(nlogn)。
2)prufer序列转化为无根树。
设点集 V = ( 1 , 2 , 3 , . . . , n ) V=(1,2,3,...,n) V=(1,2,3,...,n),每次取出prufer序列中最前面的元素u,在V中找到编号最小的没有在 p r u f e r prufer pruf