矩阵树定理学习笔记
考虑一个经典问题:一个 \(n\) 个点 \(m\) 条边的无向连通图 \(\rm{G}\),求这个图的生成树个数。 \(n \leq 300\) 。
先给 \(\rm{G}\) 随便定个向(之后的 \(\rm{G}\) 仍然为无向的),然后定义 \(\rm{G}\) 的关联矩阵 \(\rm{M}\) 满足:
显然 \(\rm{M}\) 是 \(n \times m\) 的矩阵,而且第 \(i\) 行一共有 \(\deg(i)\) 个地方有值,第 \(j\) 列只有两个地方有值。
再定义 \(\rm{G}\) 的 \(\rm{Laplace}\) 矩阵 \(\rm{L}\) 为:
首先有 \(\rm{M}\rm{M}^{\rm{T}}=\rm{L}\) , 其中 \(\rm{M}^{\rm{T}}\) 表示 \(\rm{M}\) 的转置。
证明: 考虑 \(\rm{M}\) 的第 \(i\) 行的向量 \(\rm{M}_i\) 与 \(\rm{M}^{\rm{T}}\) 的第 \(j\) 列的向量 \(\rm{M}_j\) 做点乘,分类讨论一下:
如果 \(i = j\) ,那么 \(\rm{M}_i = \rm{M}_j\) 。则点乘第 \(k\) 维的时,如果 \(e_k\) 不连接 \(i\) ,结果为 \(0\) ;否则为 \(1\) 。所以 \((\rm{M}\rm{M}^{\rm{T}})_{i,i} = \deg(i)\)。
如果 \(i \neq j\) ,那么 \(\rm{M}_{i,k} \times \rm{M}_{j,k}\) 有值时,当且仅当 \(e_k\) 连接了 \(i,j\) ,此时值为 \(-1\) ;否则为 \(0\) 。因此 \((\rm{M}\rm{M}^{\rm{T}})_{i,j} = -f_{i,j}\)。
定义一个矩阵 \(\rm{M}\)_0 是 \(\rm{M}\) 去掉任意一行后的新矩阵。
定义一个关于 \(\rm{M}_0\) 的矩阵 \(\rm{M}_0[\rm{S}]\) 为 \(\rm{M}_0\) 的第 \(i_1 , i_2 , \cdots i_{n-1}\) 个列向量组成的子矩阵。其中 \(i_1 , i_2 , i_{n-1} \in \rm{S}\) , \(\rm{S}\) 为大小等于 \(n-1\) 的一个边集。
现在设原图点集 \(\rm{V}\) 与 \(\rm{S}\) 构成的子图为 \(\rm{G_0}\) ,若 \(\rm{G_0}\) 不构成生成树,即\(\rm{G_0}\) 有环,则 \(\det(\rm{M}_0[S]) = 0\);否则等于 \(±1\) 。
证明 :假设出现环了,且假设环由 \(e_1 , e_2 , \cdots e_l\) 这些边组成。则容易发现这 \(l\) 条边对应的列向量是线性相关的。此时的行列式就等于 \(0\) 。否则就构成生成树了。考虑怎么如果这些边构成了生成树,怎么计算这个矩阵的行列式。首先从叶子开始拓补排序,按照拓补序给行向量排个序。显然与叶子有关的边只有一条,我们把它对应的列向量排到队列里面去。这样的话每个点一定在它所有儿子的后面,当我们排序完所有儿子的边的列向量之后,现在与它相关的边又只有一条了,此时我们还是把它排到队列里去。可以发现像这样排序后第 \(i\) 行的第 \(i+1\)~\(n-1\) 列都是没有值的,此时就把矩阵变成了一个分布在左下的三角矩阵。由于对角线上的元素只可能是 \(±1\) ,又因为排序时行间交换与列间交换只会对正负造成影响,所以这个矩阵的行列式为 \(±1\) 。
再补充一个 \(\rm{Binet Cauchy}\) 定理 :
约定其中 \(\rm{A}\) 是一个 \(n \times m\) 的矩阵, \(\rm{B}\) 是一个 \(m\times n\) 的矩阵,\(\rm{A[S]}\) 为从 \(\rm{A}\) 中选出编号集合为 \(\rm{S}\) 的行向量组成的矩阵,与之前定义一样; \(\rm{B[S]}\) 为选出列向量,与上面有区别。
容易发现前两种情况是第三种的特殊情况,因此我们只关注第三种情况。
这里大概证一下:
由于行列式是枚举排列,考虑枚举每一列的 \(k\) :
注意到当存在一个 \(k_a=k_b\) 时,行列式就为 \(0\) 了。所以我们对 \(\rm{A}\) 的下标枚举一个不可重集 \(\{ i_1 , i_2 , \cdots , i_n \}\) ,集合元素都在 \([1,m]\) 之间。则现在的 \(\{ k_1,k_2, \cdots k_n \}\) 对应以一个 \(\{ i_1 , i_2 , \cdots , i_n \}\) 排序前的序列。注意到排序时一旦有 \(i<j,k_i>k_j\) ,则 第\(k_i\)行 会被交换一次,因此交换次数等于逆序对数,也就是 \(\sigma(k_1,k_2,\cdots,k_n)\) 。那么:
证完前面这些引理就很容易证矩阵树定理了。
类似于 \(\rm{M_0}\) (假设去掉的是第 \(i\) 行),我们定义一个 \(\rm{L}_0\) 表示去掉 \(\rm{L}\) 的第 \(i\) 行第 \(i\) 列后的新矩阵。显然有 \(\rm{M_0}\rm{M_0}^{\rm{T}}=\rm{L}_0\)。则
证明 :
然后我们又知道,当 \(\rm{S}\) 对应的边集成环时行列式为 \(0\) ,否则为 \(±1\) 。因此 \(\sum_{|S|=n-1}\det(\rm{M_0}[\rm{S}])^2\) 就等于生成树个数。
至此我们将生成树计数转化为了计算行列式,就可以做到 \(\mathcal{O} (n^3)\) 了。
拓展 :有向图的有根生成树计数。
有根外向树 :
由于是有向图,我们不需要先给 \(\rm{G}\) 定向,直接用原图的方向构造关联矩阵 \(\rm{M}\) 即可。再构造一个 入度矩阵 \(\rm{D}\) ,如果第 \(i\) 条边连接 \(x\rightarrow y\) ,则令 \(\rm{D}_{y,i}=1\)。再构造有向图的外向 \(\rm{Laplace}\) 矩阵 \(\rm{L}\) ,与无向图情况的定义相同。
可以类似地将无向图的引理对应过来:
首先有 \(\rm{MD^T=L}\) 。然后给 \(\rm{M}\) 和 \(\rm{D}\) 去掉第 \(\rm root\) 行形成 \(\rm{M_0,D_0}\) ( \(\rm root\) 为根),考虑 \(\rm{M_0[S]}\) ,发现如果成环了或者有边连向 \(\rm root\) 行列式就为 \(0\) ,否则为 \(±1\) ;同样地观察 \(\rm{D_0[S]}\) ,发现如果不连通且未成环,行列式也为 \(0\) ,因为存在入度为 \(0\) 的点,否则行列式为 \(1\) 。
仿照无向图的证明过程,我们把 \(\rm L\) 的第 \(\rm root\) 行和第 \(\rm root\) 列去掉形成 \(\rm L_0\) ,仍然有 \(\rm L_0 = M_0D_0^T\) ,那么把 \(\rm L_0\) 的行列式用 \(\rm BinetCauchy\) 定理展开就可以得到 \(\rm L_0\) 的行列式等于以 \(\rm root\) 为根的外向生成树个数。
有根内向树 :
类似于外向的情况,只不过要给 \(\rm M\) 乘个 \(-1\) 的系数,把 \(\rm D\) 改成出度矩阵即可。其余的证明因为太相似所以略过。