2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus)

G

给出(n,nle 1000000),求(n)个点编号分别为(1)(n)的树有多少种存在二分图完美匹配。

注意到判断一棵具体的树是否存在二分图完美匹配比较难搞并且计数的复杂度无法接受,考虑先把1~n的排列分成n/2个二元组表示某个完美匹配,再在匹配边之间连接(frac{n}{2}-1)条边使其变成一棵树

把排列分成(n/2)个内部有序的二元组的方案数是(n)的全排列的方案数除以相邻位置俩俩配对形成的(n/2)个元素的全排列方案数,即(frac{n!}{frac{n}{2}!}). 那它们之间连边形成一棵树的方案数呢?

统计树的方案数,可以借助(prufer)​序列。

(prufer)序列的构造方法是:每次找到编号最小的叶子节点(度数为1的点),删除该节点并把与其相连的点的编号加入当前序列的末端,重复上述操作直到整棵树中只剩下2个点。

通过(prufer)​​序列得到无根树,可以考虑逆向执行上述过程:每次找出prufer序列首的点u,将点集(初始为{1,2,...,n})中最小的没有在prufer序列中出现的结点记为v,在u,v之间连边并从点集中删除v,从prufer序列中删除u(注意prufer序列的后面可能还有u,此处删除的是当前序列首的u)。按照这样操作,当prufer序列为空时,点集中只剩下两个点,在其之间连边,树的构建就完成了。

对于一棵(n)个点,点依次从(1)(n)编号的无根树,有唯一一个长为(n-2)(prufer)序列与其对应,这个序列的每个位置上的取值均为(1)(n)​​中的某个整数,并且可以重复。因此(n)个点的无根树有(n^{n-2})种,每个位置有(n)个取值,一共(n-2)​个位置。

关于(k)个连通块之间连接(k-1)条边形成连通图的方案数,prufer序列还能推出一个结论:答案为(n^{k-2}prod s_i),其中(s_i)是第(i)​​个连通块的大小。

可以这样理解:构造prufer序列时,除去最后留下的那两个连通块,其他连通块都有唯一一个点用于与其“父亲”连通块连边,将其记为该连通块的代表元,最后剩下的那两个连通块之间的边所连接的两端点也视为那两个连通块的代表元,那么所有连通块的代表元共有(prod s_i)种选法。而prufer序列长度为(k-2),值域为([1,n]),因此共有(n^{k-2} prod s_i)种方案。

原文地址:https://www.cnblogs.com/YjmStr/p/15494351.html