矩阵树定理学习笔记

矩阵树定理学习笔记

矩阵树定理是一个用于求出有向/无向图中生成树的个数的工具

说是矩阵树定理学习笔记,其实更像线性代数基础知识补全

前置知识

可以参考一下这篇文章中的部分内容,可能与本文有部分重复

矩阵

矩阵是 OI 中的线性代数中比较重要的一个东西,一个矩阵长成这样

\[A= \left [ \begin{matrix} A_{11} & A_{12} & \dots & A_{1M}\\ A_{21} & A_{22} & \dots & A_{2M}\\ \dots & \dots & \dots & \dots \\ A_{N1} & A_{N2} & \dots & A_{NM} \end{matrix} \right ] \]

其中 \(N\) 为矩阵的行数,\(M\) 为矩阵的列数

\(N=M\) 时其为一个方阵,也就是行数和列数相等的矩阵

方阵的主对角线即为满足行号的列号相等的元素,即 \(A_{ii}\)

上三角矩阵即为矩阵主对角线左下方的元素(所有 \(j<i\)\(A_{ij}\))均为 \(0\) 的矩阵

下三角矩阵即为矩阵主对角线右上方的元素(所有 \(j>i\)\(A_{ij}\))均为 \(0\) 的矩阵

矩阵的转置为将矩阵 \(A\) 的每个元素交换行号的列号得到的矩阵,记作 \(A^{T}\)(例如 \(A_{13}={A^{T}}_{31}\)

矩阵乘法

两个矩阵 \(A\)\(B\) 相乘,要求 \(A\) 的列数和 \(B\) 的列数相同

\(A\) 的一行和 \(B\) 中的一列共同确认结果矩阵 \(C\) 上一个位置的值,也就是左行右列

\[\begin{aligned} AB= \begin{bmatrix} A_{11} & A_{12} & A_{13} \\ A_{21} & A_{22} & A_{23} \\ A_{31} & A_{32} & A_{33} \\ A_{41} & A_{42} & A_{43} \end{bmatrix} \times \begin{bmatrix} B_{11} & B_{12} \\ B_{21} & B_{22} \\ B_{31} & B_{32} \end{bmatrix} \\ = \begin{bmatrix} \sum_{k=1}^{3} A_{1k}B_{k1} & \sum_{k=1}^{3} A_{1k}B_{k2} \\ \sum_{k=1}^{3} A_{2k}B_{k1} & \sum_{k=1}^{3} A_{2k}B_{k2} \\ \sum_{k=1}^{3} A_{3k}B_{k1} & \sum_{k=1}^{3} A_{3k}B_{k2} \\ \sum_{k=1}^{3} A_{4k}B_{k1} & \sum_{k=1}^{3} A_{4k}B_{k2} \end{bmatrix} = \begin{bmatrix} C_{11} & C_{12} \\ C_{21} & C_{22} \\ C_{31} & C_{32} \\ C_{41} & C_{42} \end{bmatrix} \end{aligned} \]

矩阵乘法不具有交换律(不一定满足 \(AB=BA\)),但是满足分配率(\(A(B+C)=AB+AC\)\((A+B)C=AC+BC\)

矩阵乘法可以被看作一个线性空间 \(\R_N\) 到另一个线性空间 \(\R_M\) 的变换,这种理解方式可能会对理解矩阵的秩有一定帮助

行列式

对于 \(N\) 阶方阵 \(A\)(行数和列数相等的矩阵),定义其行列式如下:

\[\det A=\sum_{P}(-1)^{\pi(P)}\prod_{i} A_{i,P_i}\\ \]

其中 \(P\) 枚举所有 \(N\) 阶排列,\(\pi(P)\) 表示排列的逆序对数

这个式子的实质是在枚举所有从 \(A\) 中选 \(N\) 个位置且这 \(N\) 个位置的行号以及列号均不相等,并对所有这样的方案的位置之积(\(\prod_{i} A_{i,P_i}\))再乘上 \(-1\) 的若干次方求和

行列式有许多性质,这里给出一些性质及其证明:

  1. 在行列式中取出若干个位置 \(x_1,x_2,\dots,x_N\)\(y_1,y_2,\dots,y_N\),则 \(A_{x_1y_1}A_{x_2y_2}\dots A_{x_ny_n}\)(枚举到的位置的元素之积)这一项在行列式中的符号为 \((-1)^{\pi(x_1,x_2,\dots,x_N)+\pi(y_1,y_2\dots,y_N)}\)

证明:

对于一个排列 \(P\) 交换其中任意两项的得到的排列 \(P'\),一定满足 \(\pi(P)\)\(\pi(P')\) 奇偶性不同

证明:假设 \(P\) 的结构为 $\dots a\dots i\dots b\dots j\dots c\dots $,那么现在交换 \(i\)\(j\) 这两项,对于 \(a\)\(c\) 区域的元素,它们与 \(i\)\(j\) 的相对位置关系均没有发生变化,因此它们对于 \(\pi (P)\)\(\pi(P')\) 的贡献是相同的

考虑 \(b\) 区域的元素,它们与 \(i\) 和与 \(j\) 的相对大小关系一定发生了变化,但是由于对于 \(i\)\(j\) 的相对大小关系都发生了变化(一个小于变成大于,一个大于变成小于),对于 \(\pi\) 的变化一正一负抵消掉了

因此实际上变化的只有 \(i\)\(j\) 之间的大小关系,所以 \(\pi(P)\)\(\pi(P')\) 的奇偶性一定不同

考虑对 \(x_1,x_2,\dots,x_N\) 进行冒泡排序,直到其变为 \(1,2,\dots,N\),显然这样最后对应的 \(y_1,y_2,\dots,y_N\) 一定是唯一的

我们交换 \(x_i\)\(x_j\) 的同时也交换 \(y_i\)\(y_j\),这样 \(\pi(x_1,x_2,\dots,x_N)\)\(\pi(y_1,y_2,\dots,y_N)\) 的奇偶性同时发生变化,所以 \((-1)^{\pi(x_1,x_2,\dots,x_N)+\pi(y_1,y_2\dots,y_N)}\) 不变,自然也就和最终的 \(y_1,y_2,\dots,y_N\) 所对应的 \((-1)^{\pi(P)}\) 相等

  1. 矩阵转置后行列式不变(\(\det A=\det A^{T}\)

证明:

转置对于一组元素的选择相当于交换了 \(x_1,x_2,\dots,x_N\)\(y_1,y_2,\dots,y_N\)

根据性质 1 其系数为 \((-1)^{\pi(x_1,x_2,\dots,x_N)+\pi(y_1,y_2\dots,y_N)}\),显然不变,因此行列式不变

  1. 交换行列式中的两行/两列,行列式正负取反(\(\det A=-\det A'\)

证明:

上述变化相当于对于一组元素的选择交换了 \(x_1,x_2,\dots,x_N\) 中的两项或交换了 \(y_1,y_2,\dots,y_N\) 中的两项

根据性质 1 的证明过程,此时 \(\pi(x_1,x_2,\dots,x_N)\) 奇偶性发生变化或 \(\pi(y_1,y_2,\dots,y_N)\) 奇偶性发生变化

因为所有元素的组合方式对行列式的贡献均取反,因此行列式也取反

  1. 若行列式中某两行/两列相等,则行列式为 \(0\)

证明:

由于矩阵转置后行列式不变(性质 2),这里只考虑两行相同的情况

假设相同的行为第 \(i\) 行和第 \(j\) 行,由于有 \(A_{ik}=A_{jk}\),若交换 \(P_i\)\(P_j\)(这个 \(P\) 是行列式计算公式中,关于列的选择的排列),则 \(\prod_{i} A_{i,P_i}\) 不变

但又因为 \(\pi(P)\) 奇偶性发生变化,系数取反,因此所有关于行列式的贡献两两抵消,最终行列式为 \(0\)

  1. 若对于行列式的某一行加上另一行(固定 \(i,j\),对于所有 \(k\) 进行 \(A_{ik}\gets A_{ik}+A_{jk}\)),则矩阵的行列式不变

证明:

根据加法原理,在枚举第 \(i\) 行的时候我们可以认为第 \(i\) 行的每个位置都有两个元素,进而可以看做我们其实是在对于两个矩阵的行列式求和,一个是进行上述操作之前矩阵 \(A\),另一个是将 \(A\) 的第 \(i\) 行替换成 \(A\) 的第 \(j\) 行的矩阵 \(A'\)

其中根据性质 4 可知,后者 \(A'\) 的的行列式 \(\det A'=0\),因此得到的的行列式就是操作之前的矩阵 \(A\) 的行列式 \(\det A\)

  1. 上三角矩阵/下三角矩阵的行列式即为主对角线上的元素之积(\(\prod_{i} A_{ii}\)

证明:

考虑排列 \(P\),若某个 \(P_i>i\),则一定会有某个 \(P_j<j\);若某个 \(P_i<i\),则一定会有某个 \(P_j>j\)

又因为 \(i<j\)\(A_{ij}=0\)\(i>j\)\(A_{ij}=0\),为了对行列式的贡献不为 \(0\),只能让 \(P=[1,2\dots,N]\),此时 \(P\) 不存在任何逆序对(\((-1)^{\pi(P)}=0\)),因此对答案的贡献即为所有元素之积


有了以上这几个性质,我们就可以很方便的求出矩阵的行列式

这里懒得讲了,其实就是套用高斯消元的过程,同时维护 \(\det A\) 的系数(交换两行乘上 \(-1\),某行加上若干倍另一行 \(\det A\) 不变),最后求出消完元后的矩阵的主对角线元素之积乘上先前维护的系数即可

如果模数不是质数需要使用辗转相减法,复杂度依然为 \(O(n^3)\)

正文

结论

矩阵树定理可以将求图 \(G\) 中生成树个数的问题转化为求行列式求值问题

假设图 \(G\) 中点的个数为 \(N\),边的个数为 \(M\)

由于矩阵树定理的证明十分困难,这里先给出结论

无向图生成树个数

\(A(G)\) 为无向图 \(G\) 的邻接矩阵(大小为 \(N\times N\)),也就是 \(A(G)_{ij}\) 为无向图 \(G\) 中点 \(i\) 到点 \(j\) 的边的个数(无向图中 \(A_{ij}=A_{ji}\)

\(D(G)\) 为无向图 \(G\) 的度数矩阵(大小为 \(N\times N\)),也就是 \(D(G)_{ii}\) 表示无向图 \(G\) 中点 \(i\) 的度数,\(D_{ij}=0\)\(i\neq j\)

定义无向图 \(G\) 的 Kirchhoof 矩阵 \(K(G)=D(G)-A(G)\)

定义 \(X_0(G,k)\)\(X(G)\) 去掉第 \(k\) 行与第 \(k\) 列得到的矩阵

无向图 \(G\) 的生成树个数 \(t(G)=\det K_0(G,k)\)

\(t(G)\) 还有一种特征值表示法

有向图生成树个数

根向树就是树的根节点的入度大于 \(0\),出度等于 \(0\) 的树(边指向根的树)

叶向树就是树的根节点的入度等于 \(0\),出度大于 \(0\) 的树(边指向叶子的树)

\(A(G)\) 为有向图 \(G\) 的邻接矩阵,\(A(G)_{ij}\) 表示从点 \(i\) 指向点 \(j\) 的有向边的个数(注意这里是从 \(i\)\(j\) 的有向边,不包括 \(j\to i\) 的边)

\(D^{out}(G)\) 为有向图 \(G\) 的出度矩阵,其中 \({D^{out}(G)}_{ii}\) 为点 \(i\) 的出度,\({D^{out}(G)}_{ij}=0\)\(i\neq j\)

\(D^{in}(G)\) 为有向图 \(G\) 的入度矩阵,其中 \({D^{in}(G)}_{ii}\) 为点 \(i\) 的入度,\({D^{in}(G)}_{ij}=0\)\(i\neq j\)

定义有向图 \(G\) 的出度 Kirchhoof 矩阵 \(K^{out}(G)=D^{out}(G)-A(G)\)

定义有向图 \(G\) 的入度 Kirchhoof 矩阵 \(K^{in}(G)=D^{in}(G)-A(G)\)

定义 \(X_0(G,k)\)\(X(G)\) 去掉第 \(k\) 行与第 \(k\) 列得到的矩阵

有向图的以 \(k\) 为根的根向图生成树个数 \(t^{root}(G,k)=\det K^{out}_{0}(G,k)\)

有向图的以 \(k\) 为根的叶向图生成树个数 \(t^{leaf}(G,k)=\det K^{in}_{0}(G,k)\)

证明

posted @ 2026-01-14 22:11  Lyz09  阅读(0)  评论(0)    收藏  举报