prufer序列

Cayley 定理

一棵有标号生成树唯一对应着一个 prufer 序列。

任意一个长度为 n − 2 n-2 n2、值域为 [ 1 , n ] [1,n] [1,n] 的序列也唯一对应着一棵大小为 n n n 的有标号生成树。

若一个点 u u u 在 prufer 序列中出现 d d d 次,那么它在树上的度数为 d + 1 d+1 d+1

扩展 Cayley 定理

考虑若干个大小分别为 s 1 , s 2 , ⋯   , s k s_1,s_2,\cdots,s_k s1,s2,,sk 的连通块(它们都是树),且满足 ∑ s i = n \sum s_i=n si=n,我们需要连 k − 1 k-1 k1 条边让这若干个连通块构成一棵树,求能得到多少有标号无根树。

假瑞说按生成函数推很顺手:考虑将每个连通块当成一个大点,那么我们肯定是连 k − 1 k-1 k1 条边让这 k k k 个大点构成一棵树,这 k k k 个大点构成的树会对应一个长度为 k − 2 k-2 k2、值域为 [ 1 , k ] [1,k] [1,k] 的 prufer 序列,我们考虑枚举这 k k k 个大点的度数,即在 prufer 序列中出现的次数:
a n s = ∑ d 1 + ⋯ + d k = k − 2 ( k − 2 ) ! d 1 ! ⋯ d k ! ∏ i = 1 k s i d i + 1 ans=\sum_{d_1+\cdots+d_k=k-2}\dfrac{(k-2)!}{d_1!\cdots d_{k}!}\prod_{i=1}^ks_i^{d_i+1} ans=d1++dk=k2d1!dk!(k2)!i=1ksidi+1
F i ( x ) = ∑ d ≥ 0 s i d + 1 d ! x d = s i ∑ d ≥ 0 s i d d ! x d = s i e s i x F_i(x)=\sum\limits_{d\geq 0}\dfrac{s_i^{d+1}}{d!}x^d=s_i\sum\limits_{d\geq 0}\dfrac{s_i^d}{d!}x^d=s_ie^{s_ix} Fi(x)=d0d!sid+1xd=sid0d!sidxd=siesix,那么:
a n s = ( k − 2 ) ! ∑ d 1 + ⋯ + d k = k − 2 ∏ i = 1 k [ x d i ] F i ( x ) = ( k − 2 ) ! [ x k − 2 ] ∏ i = 1 k F i ( x ) = ( k − 2 ) ! [ x k − 2 ] ∏ i = 1 k s i e s i x = ( k − 2 ) ! ∏ i = 1 k s i [ x k − 2 ] e ( ∑ s i ) x = ( k − 2 ) ! ∏ i = 1 k s i [ x k − 2 ] e n x = n k − 2 ∏ i = 1 k s i \begin{aligned} ans&=(k-2)!\sum_{d_1+\cdots+d_k=k-2}\prod_{i=1}^k[x^{d_i}]F_i(x)\\ &=(k-2)![x^{k-2}]\prod_{i=1}^kF_i(x)\\ &=(k-2)![x^{k-2}]\prod_{i=1}^ks_ie^{s_ix}\\ &=(k-2)!\prod_{i=1}^{k}s_i[x^{k-2}]e^{(\sum s_i)x}\\ &=(k-2)!\prod_{i=1}^k s_i[x^{k-2}]e^{nx}\\ &=n^{k-2}\prod_{i=1}^ks_i \end{aligned} ans=(k2)!d1++dk=k2i=1k[xdi]Fi(x)=(k2)![xk2]i=1kFi(x)=(k2)![xk2]i=1ksiesix=(k2)!i=1ksi[xk2]e(si)x=(k2)!i=1ksi[xk2]enx=nk2i=1ksi
听说这种生成函数推导方法很普遍适用。

k k k 部完全图的生成树计数问题

对于 N N N 个点的 k k k 部图 G G G,设其第 i i i 部有 n i n_i ni 个点,任意不同部的两点之间都有一条边相连。那么图 G G G 的生成树个数为:

N k − 2 ∏ i = 1 k ( N − n i ) n i − 1 N^{k-2}\prod_{i=1}^k(N-n_i)^{n_i-1} Nk2i=1k(Nni)ni1

证明:矩阵树定理的证明和 prufer 序列的证明均给出了。

矩阵树定理

即求下面这个矩阵的行列式:(注意由于抽掉了一行一列,矩阵行列数为 N − 1 N-1 N1

在这里插入图片描述

我们将它拆成 A + B A+B A+B,其中 B B B 是全 − 1 -1 1 矩阵,那么:

det ⁡ ( A + B ) = ∑ p ( − 1 ) sgn ⁡ ( p ) ∏ i ( A i , p i + B i , p i ) = ∑ p ( − 1 ) sgn ⁡ ( p ) ∑ S ⊂ { 1 , ⋯   , N − 1 } ∏ i ∈ S A i , p i ∏ i ∉ S B i , p i = ∑ S ⊂ { 1 , ⋯   , n } ∑ p ( − 1 ) sgn ⁡ ( p ) ∏ i ∈ S A i , p i ∏ i ∉ S B i , p i \begin{aligned}\det(A+B)&=\sum_{p}(-1)^{\operatorname{sgn}(p)}\prod_{i}(A_{i,p_i}+B_{i,p_i})\\&=\sum_{p}(-1)^{\operatorname{sgn}(p)}\sum_{S\subset \{1,\cdots,N-1\}}\prod_{i\in S}A_{i,p_i}\prod_{i\not\in S}B_{i,p_i}\\&=\sum_{S\subset\{1,\cdots,n\}}\sum_{p}(-1)^{\operatorname{sgn}(p)}\prod_{i\in S}A_{i,p_i}\prod_{i\not\in S}B_{i,p_i}\end{aligned} det(A+B)=p(1)sgn(p)i(Ai,pi+Bi,pi)=p(1)sgn(p)S{1,,N1}iSAi,piiSBi,pi=S{1,,n}p(1)sgn(p)iSAi,piiSBi,pi

考虑 ∑ p ( − 1 ) sgn ⁡ ( p ) ∏ i ∈ S A i , p i ∏ i ∉ S B i , p i \sum_{p}(-1)^{\operatorname{sgn}(p)}\prod_{i\in S}A_{i,p_i}\prod_{i\not\in S}B_{i,p_i} p(1)sgn(p)iSAi,piiSBi,pi 的含义,实际上就是把 A A A 中属于 s s s 的那些行、以及 B B B 中不属于 s s s 的那些行抽出来拼成一个新的矩阵,然后求这个新矩阵的行列式。

那么若从 B B B 中至少抽出了两行,那么新矩阵中就会有两行全为 − 1 -1 1,此时该矩阵行列式一定为 0 0 0

即我们只需考虑 ∣ S ∣ ≥ N − 2 |S|\geq N-2 SN2,即至多从 B B B 中抽出一行的情况。

先考虑 ∣ S ∣ = N − 2 |S|=N-2 S=N2 的情况,我们即求如下左矩阵的行列式:

在这里插入图片描述

我们先关注左上角的 ( n 1 − 1 ) × ( n 1 − 1 ) (n_1-1)\times(n_1-1) (n11)×(n11) 的子矩阵:显然可以对前 n 1 − 1 n_1-1 n11 行操作将该子矩阵消成对角矩阵,再通过消出来的这 n 1 − 1 n_1-1 n11 行把那行 − 1 -1 1 的前 n 1 − 1 n_1-1 n11 列全消了,然后再将前 n 1 − 1 n_1-1 n11 行复原回原来的样子。类比地,我们能将整个矩阵通过如上方式转化成右边的矩阵。

此时整个矩阵的行列式等于对角线上各个子矩阵的行列式之积,而对角线上各个子矩阵的行列式是好求的。

枚举 − 1 -1 1 所在的行即可得到 ∣ S ∣ = N − 2 |S|=N-2 S=N2 的结果,然后再加上 ∣ S ∣ = N − 1 |S|=N-1 S=N1,经过化简即可得到结论。

prufer 序列

仍然是考虑构造双射。如果用普通的 prufer 序列,树 → \to prufer 不会有问题,但问题是不一定每一种 prufer 序列都能映射到树。

会出现的问题是:当我们取出全局编号最小的叶子,要和当前 prufer 序列的第一位连边时,会发现二者可能在同一部。

为了避免该问题,我们采用如下的映射方法:(设所有点构成的集合为 V V V,第 i i i 部点构成的集合为 V i V_i Vi

  • → \to prufer:初始先建立 k + 1 k+1 k+1 个空序列 A 1 , ⋯   , A k , B A_1,\cdots,A_k,B A1,,Ak,B。然后重复如下过程直到图中仅剩两点为止:

    每次选择全局编号最小的叶子,记为 u u u,设 u u u 在第 i i i 部。记 u u u 父亲为 f f f

    • u u u 不为当前第 i i i 部内最后一个点,则将 f f f 插入到 A i A_i Ai 末尾。

    • 否则,将 f f f 插入到 B B B 末尾。

    u u u 从图中删去。

  • prufer → \to 树:只需证明对于任意满足 A i A_i Ai 长度为 n i − 1 n_i-1 ni1 B B B 长度为 k − 2 k-2 k2 A i A_i Ai 中元素属于 V ∖ V i V\setminus V_i VVi B B B 中元素属于 V V V 的 prufer 序列,都能映射回一棵合法的树即可。

    初始先建立一个集合 S = { 1 , ⋯   , n } S=\{1,\cdots,n\} S={1,,n}。重复如下过程直到 A 1 , ⋯   , A k , B A_1,\cdots,A_k,B A1,,Ak,B 均为空为止:

    找到 S S S 中未在 A 1 , ⋯   , A k , B A_1,\cdots,A_k,B A1,,Ak,B 中出现的编号最小的点,记为 u u u,设 u u u 在第 i i i 部。

    • A i A_i Ai 非空,则将 u u u A i A_i Ai 的第一个元素连边,并将 A i A_i Ai 的第一个元素从 A i A_i Ai 中删去。

    • 否则,将 u u u B B B 的第一个元素连边,并将 B B B 的第一个元素从 B B B 中删去。

      由于 A i A_i Ai 为空,则证明存在 n i − 1 n_i-1 ni1 个不同的第 i i i 部节点,它们之前都未在 A 1 , ⋯   , A k , B A_1,\cdots,A_k,B A1,,Ak,B 中出现,那么取出的 B B B 的第一个元素,它肯定不是第 i i i 部的点,所以不会出问题。

至此,我们构造了一个树和 prufer 序列之间的双射。同时也容易看出,此时每个点在 prufer 序列中出现的次数同样是它的度数减 1 1 1

钦定每点度数的 k k k 部完全图的生成树计数问题

open problem (in my blog)

至少我推出来只会指数级做法,哪位数数大师来赐教一下/kel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值