问题引入
基尔霍夫定理(基尔霍夫矩阵树定理)是用来解决这样一类问题:
给定一个n个点
m 条边的无向图,求出这个图的生成树的总数。
前置技能
基础的线性代数知识:行列式及其基本性质,矩阵,方阵的行列式及其基本性质。
Matrix-Tree Theorem
一些约定
在一开始的讨论中,我们先规定这幅图没有重边和自环。在介绍完这个定理之后,我会对该定理在一般图上的推广做简略介绍。
我们用ai,j表示矩阵的一个元素,Mi,j表示矩阵的一个余子式,Ci,j表示矩阵的一个代数余子式。
拉普拉斯矩阵
首先我们要引入图的拉普拉斯矩阵(Laplacian matrix)的概念。
无向图的拉普拉斯矩阵其实就是图的度数矩阵减去邻接矩阵:
矩阵树定理
定理内容
根据矩阵树定理,无向图的生成树个数就等于这副图的拉普拉斯矩阵的任意一个代数余子式值。
定理证明
拉普拉斯矩阵的性质
首先给出拉普拉斯矩阵的两个性质:
- 定理1:拉普拉斯矩阵的任意一个代数余子式值都相同
- 证明:
- 首先可以发现,拉普拉斯矩阵的每一行、每一列的和都是0
- 下面我们只证明同一行的两个代数余子式
Ci,j 和Ci,k是相同的。只需要把这个证明在同一列上推广一下即可以得出定理1。 - 考虑对Ci,j做矩阵的初等变换得到Ci,k:首先我们把拉普拉斯矩阵第k列在余子式所在列乘上一个
−1 ,然后再把其它所有列乘上−1加到这一列上。因为拉普拉斯矩阵的每一行的和都是0,可以发现,在经过上述过程之后,这一列就变成了拉普拉斯矩阵的第j 列。此时,矩阵的行列式要乘上一个−1。 - 接下来我们做|j−k−1|次对换把这一列换到它在Ci,k中的位置,此时行列式要乘上(−1)j−k−1。
- 经过以上两个过程,行列式的值乘上了(−1)j−k,结合代数余子式的定义,我们还要乘上一个(−1)j−k。也就是说,这两个代数余子式的值是相等的。
- 定理2:拉普拉斯矩阵的行列式为0
- 证明:两种思路
- 证明1:高斯消元的过程中,矩阵的每一行每一列的和依然为
0 。最后我们消成上三角矩阵,则右下角一定是0,因此行列式就是0 。 - 证明2:代数余子式有这样一个性质:∑nj=1ai,jCi,j=det(ai,j),因为任意Ci,j都相等,又由于∑nj=1ai,j=0,根据乘法分配律有det(ai,j)=0。
根据定理1,我们只需要证明C1,1是图的生成树个数就好了。
关联矩阵
对于一个n个点,
m 条边的无向图,它的关联矩阵(Incidence matrix)为一个n×m的矩阵。这个矩阵定义如下:
Bi,j=⎧⎩⎨⎪⎪⎪⎪⎪⎪1,−1,0,(i,j) is the kth edge of the graph and i<j(i,j) is the kth edge of the graph and i>jotherwise
可以发现 L=BBT。令 F矩阵为B 矩阵去掉第一行得到的矩阵,显然 FFT就是 L矩阵去掉第一行第一列之后得到的矩阵。柯西-比内公式
柯西-比内公式(Cauchy–Binet formula)是一条用在两个特定矩阵相乘上的恒等式。
假设A 是一个 n×m的矩阵, B是一个m×n 的矩阵,它们的乘积显然是一个 n×n的矩阵。
我们定义 [m]是集合 {1,...,m}, ([m]n)表示 [m]的所有大小为 n的子集组成的集合。对于S∈([m]n) ,我们定义 A[n],S为一个 n×n的矩阵,其由矩阵 A保留S 中的列得到。同理, BS,[n]也是一个人 n×n的矩阵,其由矩阵 B保留S 中的行得到。
柯西-比内公式给出了这样的结论:
det(AB)=∑S∈([m]n)det(A[n],S)det(BS,[n])
具体证明十分复杂,如果有兴趣可以看看维基上的词条。证明
有了上面所有的铺垫,我们终于可以证明矩阵树定理。
根据柯西-比内公式,我们有
Ci,j=∑S∈([m]n−1)det(F[n−1],S)det(FTS,[n−1])=∑S∈([m]n−1)det(F[n],S)2
可以发现, S实际上选择了图中的n−1 条边,这里就是在枚举所有选出 n−1条边的方案。现在我们只需要证明: S集合的边组成的图不连通时,det(F[n],S) 为 0,否则(一定是一棵树)一定是1 或 −1。
首先证明不连通的情况,因为 F[n−1],SFTS,[n−1]实际上就是 S中的边组成的图的拉普拉斯矩阵除去第一行第一列得到的矩阵,我们只需要证明当图不连通时,这个矩阵行列式是0 即可。
这个怎么证明呢?我们交换行列把同属于一个连通块的点排在一起,这样,除去左上角的连通块,其余一个连通块都可以组成一个拉普拉斯矩阵。而这个矩阵的行列式就等于所有这些连通块矩阵的行列式之积,因为拉普拉斯矩阵行列式一定是 0,因此这个矩阵的行列式就是0 。
然后再证明树的情况。首先我们可以对这棵树的点和边都重标号,这样只会影响 F[n],S行列式的符号。怎么重标号呢?你可以理解为从 1号节点对这棵树进行dfs,然后每一个点的新编号就是它的DFS 序减一(因为 1号点所在行被删掉了,不会出现在F 里面),边的话就按照遍历的先后来编号。
考虑使用数学归纳法证明,最小规模的时候显然是成立的。然后考虑我们已经有一个大小为 n−1×n−1的矩阵 F′。接下来我们加入编号为 n的点和编号为n 的边,这样会使得 F′′n,n和一个 F′′i,n(i<n)变成 1。根据代数余子式的性质,因为F′′ 的第 n行出了F′′n,n 都是 0,因此det(F′′) 就等于 F′′n,n乘上 n−1阶的 F′的行列式,也就是说行列式的值不变。至此,定理证明完毕!
推广
上面说了,我们对这个无向图做了一些人为的约定:不存在重边和自环。现在我们要把这个定理推广到一般的无向图上。
首先自环显然是不可能对答案产生影响的,我们把它们剔除。
然后对于重边,只需要把拉普拉斯矩阵中的−1推广成两点之间边数的相反数、度数记上重边的就好了。
而且这个定理还能推广到有向图的生成树计数上面,只需要对拉普拉斯矩阵做这样的修改:
∙ 对于i≠j,Li,j是从i到j 的有向边条数的相反数
∙ 对于任意i,Li,i 表示点i除去自环之后的入度
然后,该图以点i 为根的生成树个数就是Mi,i。参考资料
- 证明1:高斯消元的过程中,矩阵的每一行每一列的和依然为