[学习笔记] Matrix tree定理

前言

为了回归算法本身,为了搞懂算法,我参考了不同博客,并将他们做出整合和补充:

  • https://www.luogu.com.cn/blog/tanrui-2960967961/matrix-tree-ding-li-ji-ji-ying-yong#
  • https://blog.csdn.net/a_crazy_czy/article/details/72971868
  • https://www.cnblogs.com/zj75211/p/8039443.html
  • https://www.cnblogs.com/lishuyu2003/p/12093947.html

本文将分成 3 3 3个部分:行列式的性质,定理的证明,定理的应用和扩展。标记的即为暂时不懂的地方,会渐渐完善

行列式的性质

d e t ( A ) = ∑ p ( − 1 ) r ( p ) × A 1 , p 1 × . . . . . . × A n , p n det(A)=\sum_{p}(-1)^{r(p)}\times A_{1,p_1}\times ......\times A_{n,p_n} det(A)=p(1)r(p)×A1,p1×......×An,pn

性质1:互换矩阵的两行(列),行列式变号

可以看如下示例(盗个图)
[学习笔记] Matrix tree定理_第1张图片

对于后面乘积相同的两项,我们只用考虑前面系数变化的情况,即行列式的变化情况。

此处引出一个结论,对于一个排列,交换其中两个元素,行列式变化为奇数:[学习笔记] Matrix tree定理_第2张图片

那么后面的乘积不改变,而前面的系数是一定要变号的,所以行列式变号。

性质2:如果有两行完全相同,行列式为0

交换这两行,得到的矩阵相同,行列式不变,但由 ( 1 ) (1) (1)得行列式变号,所以行列式一定为 0 0 0

性质3 如果矩阵的某一行(列)中的所有元素都乘以同一个数k,新行列式的值等于原行列式的值乘上数k

提公因数即可

类似地,如果矩阵的某一行(列)中的所有元素都有一个公因子k,则可以把这个公因子k提到行列式求和式的外面。

性质4 如果矩阵有两行(列)成比例(比例系数k),则行列式的值为 0

先把这个比例系数提出去,然后可以运用性质2

性质5 如果把矩阵的某一行(列)加上另一行(列)的k倍,则行列式的值不变

考虑行列式的计算,我们把它拆成两部分,分别是原来的部分和新加的部分(因为每一行只会选一个,看做特殊的分配率),新加的部分一定满足性质4,加上的部分行列式为 0 0 0,所以行列式不变。

优化行列式求法

综上,我们可以把矩阵消成上三角矩阵,求对角线乘积即为行列式的值,时间复杂度 O ( n 3 ) O(n^3) O(n3)

标记1:如果要求的矩阵不允许出现实数,且需要取模,可以看看给出的博客,我不会。

Matrix Tree定理的证明

内容

Kirchhoff \text{Kirchhoff} Kirchhoff 矩阵是指的对于一个图构造出来的一个矩阵,具体定义为度数矩阵减去邻接矩阵,度数矩阵指:
A i , j = { d e g i i = j 0 o t h e r w i s e A_{i,j}=\begin{cases}deg_i&i=j\\0&otherwise\\\end{cases} Ai,j={degi0i=jotherwise定理:一个图中的生成树个数等于其 Kirchhoff \text {Kirchhoff} Kirchhoff 矩阵的任意一个代数余子式的行列式。

性质1

一个图的 Kirchhoff \text{Kirchhoff} Kirchhoff 矩阵行列式为零。

可以考虑高斯消元的过程,一开始每一行的和为 0 0 0,而消元过程中每一行的和保持是 0 0 0,最后我们要消成上三角矩阵,最后一行只有最边上元素可能有值,而行和为 0 0 0,这个值也是 0 0 0,所以行列式为 0 0 0

性质2

一个图的 Kirchhoff \text{Kirchhoff} Kirchhoff 矩阵的任一代数余子式的行列式相同。

标记2:yysy,这个性质我证不来

前置定义

我们定义一个图的关联矩阵 B B B为:对于第 k k k条边 ( u , v ) (u,v) (u,v) B k , u = 1 , B k , v = 1 B_{k,u}=1,B_{k,v}=1 Bk,u=1,Bk,v=1

一个矩阵的转置矩阵为: A i , j T = A j , i A_{i,j}^T=A_{j,i} Ai,jT=Aj,i

有一个性质,设这个图的 Kirchhoff \text{Kirchhoff} Kirchhoff L L L
L = B B T L=BB^T L=BBT

标记3:yysy,这个性质我证不来

Part 1

对于一个非联通图 G G G ∣ L ∣ = 0 |L|=0 L=0

M i M_i Mi L L L 删去第 i i i行第 i i i列后得到的矩阵,设 G i G_i Gi 为第 i i i个强联通分量,我们把同一个强联通分量的结点通过交换行换到一起(虽然会变号,但如果行列式为 0 0 0就没关系), Kirchhoff \text{Kirchhoff} Kirchhoff 矩阵变为这样:
G 1 0 . . . . . . 0 0 G 2 . . . . . . 0 . . . . . . . . . . . . . . 0 0 0 G k \begin{matrix}G_1&0&......&0\\0&G_2&......&0\\...&...&......&..\\0&0&0&G_k\end{matrix} G10...00G2...0..................000..Gk其中 ∣ G i ∣ = 0 |G_i|=0 Gi=0 Kirchhoff \text{Kirchhoff} Kirchhoff 矩阵的性质 1 1 1),我们可以看出:
∣ L ∣ = ∣ G 1 ∣ × . . . . . × ∣ G k ∣ |L|=|G_1|\times .....\times |G_k| L=G1×.....×Gk所以 ∣ L ∣ = 0 |L|=0 L=0,也不难推知 ∣ M i ∣ = 0 |M_i|=0 Mi=0

Part 2

对于一棵树 G G G ∣ M i ∣ = 1 |M_i|=1 Mi=1

标记4:yysy,我不会证

Part 3

标记5:yysy,这个定理不会证明

首先要知道 Binet-Cauthy \text{Binet-Cauthy} Binet-Cauthy定理,内容大致如下:
∣ A B ∣ = ∑ ∣ S ∣ = n ∣ A p ∣ × ∣ B p ∣ |AB|=\sum_{|S|=n}|A_p|\times |B_p| AB=S=nAp×Bp其中A是一个 m × n m×n m×n的矩阵,B是一个 n × m n×m n×m的矩阵, A p A_p Ap是把 A A A的一些行删去(剩下的行集合为 S S S)使之成为 n × n n\times n n×n的矩阵, B p B_p Bp类似地删去它的列。

套用这个定理,我们可以推倒:
∣ M i ∣ = ∣ B i ∣ × ∣ B i T ∣ = ∑ ∣ S ∣ = n − 1 ∣ B i , p ∣ × ∣ B i , p T ∣ |M_i|=|B_{i}|\times|B_{i}^T|=\sum_{|S|=n-1}|B_{i,p}|\times |B_{i,p}^T| Mi=Bi×BiT=S=n1Bi,p×Bi,pT结合 part 1 \text{part 1} part 1 part 2 \text{part 2} part 2,我们可以知道当是一棵树的时候会产生 1 1 1的贡献,其余情况为 0 0 0,所以 ∣ M i ∣ |M_i| Mi即为生成树个数。

应用及扩展

板题

点此看题

我因为输出格式卡了很久,我好像是sb(自信点,把好像去掉)

板题2

点此看题解(一站式服务)

矩阵树定理的扩展

这是对于更宽泛的问题,做做这道题吧

有向扩展

什么?矩阵树还能有向扩展?

比较基础的是这道题

综合应用

点此看题

你可能感兴趣的:(矩阵树定理)