首页 > 其他分享 >prufer序列

prufer序列

时间:2022-10-31 08:56:28浏览次数:34  
标签:sum 矩阵 cdots 序列 prod prufer

Cayley 定理

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

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

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

扩展 Cayley 定理

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

假瑞说按生成函数推很顺手:考虑将每个连通块当成一个大点,那么我们肯定是连 \(k-1\) 条边让这 \(k\) 个大点构成一棵树,这 \(k\) 个大点构成的树会对应一个长度为 \(k-2\)、值域为 \([1,k]\) 的 prufer 序列,我们考虑枚举这 \(k\) 个大点的度数,即在 prufer 序列中出现的次数:

\[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} \]

设 \(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}\),那么:

\[\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} \]

听说这种生成函数推导方法很普遍适用。

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

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

\[N^{k-2}\prod_{i=1}^k(N-n_i)^{n_i-1} \]

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

矩阵树定理

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

在这里插入图片描述

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

\[\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} \]

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

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

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

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

在这里插入图片描述

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

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

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

prufer 序列

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

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

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

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

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

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

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

    将 \(u\) 从图中删去。

  • prufer \(\to\) 树:只需证明对于任意满足 \(A_i\) 长度为 \(n_i-1\)、\(B\) 长度为 \(k-2\)、\(A_i\) 中元素属于 \(V\setminus V_i\)、\(B\) 中元素属于 \(V\) 的 prufer 序列,都能映射回一棵合法的树即可。

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

    找到 \(S\) 中未在 \(A_1,\cdots,A_k,B\) 中出现的编号最小的点,记为 \(u\),设 \(u\) 在第 \(i\) 部。

    • 若 \(A_i\) 非空,则将 \(u\) 和 \(A_i\) 的第一个元素连边,并将 \(A_i\) 的第一个元素从 \(A_i\) 中删去。

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

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

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

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

open problem (in my blog)

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

标签:sum,矩阵,cdots,序列,prod,prufer
From: https://www.cnblogs.com/ez-lcw/p/16843062.html

相关文章

  • 力扣 105. 从前序与中序遍历序列构造二叉树
    105.从前序与中序遍历序列构造二叉树给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树......
  • 反序列化漏洞
    反序列化漏洞简介PHP反序列化漏洞也叫PHP对象注入,形成的原因是程序未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行、文件操作、执......
  • 排序算法之最长和谐子序列
    题目和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。现在,给你一个整数数组nums,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是......
  • 最长连续递增序列解题思路
    题目给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。连续递增的子序列可以由两个下标l和r(l<r)确定,如果对于每个l<=i<r,都有nums[i]......
  • 392.is-subsequence 判断子序列
    问题描述392.判断子序列解题思路与1143.最长公共子序列基本一样,只需要再判断结果是否和s.size()相等就好了。代码classSolution{public:boolisSubsequence......
  • 115.distinct-subsequence 不同的子序列
    问题描述115.不同的子序列解题思路dp[i][j]表示考虑考虑t的前j个字符在s的前i个字符中的出现个数:if(s[i-1]==t[j-1])dp[i][j]=dp[i-1][j-1]+dp[i-......
  • 300.longest-increasing-subsequence 最长递增子序列
    问题描述300.最长递增子序列解题思路关键在于,dp[i]表示什么含义便于解这道题,子序列不一定连续,所以为了便于求解,dp[i]应该表示为以nums[i-1]结尾的最长严格递增子序列......
  • 674.longest-continuous-increasing-subsequence 最长连续递增序列
    问题描述674.最长连续递增序列解题思路dp[i]表示以nums[i-1]结尾的最长连续递增子序列长度;递推关系为:if(nums[i-1]>nums[i-2])dp[i]=dp[i-1]+1......
  • pikachu php反序列化漏洞
    原理php中serialize(),unserialize()这两个函数。序列化serialize()序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:classS{publ......
  • 15.几种序列化方式
    什么是序列化关于序列化相信大家都很了解,在Java中我们经常就可以看到很多实体类或者 POJO 都会实现 Serializable 接口,有了解过 Serializable 接口的小伙伴应该都......