矩阵树定理

\(zay\)\(T3\ balabalabalabala\)所以它是个矩阵树时我是懵逼的
啥玩意?矩阵树?那是啥?能吃吗?
于是就有了盯着洛谷日报并一脸懵逼的我以及这篇博客

前置芝士

0.有个脑子
1.行列式求值
2.上三角矩阵的行列式的值等于其对角线上所有的值的乘积
3.高斯消元
4.矩阵乘法

一些定义

一.度数矩阵\(A\)
\(A_{i,i}=degree_i\),其余为0。

二.邻接矩阵\(B\)
\(B_{i,j}\)\(i,j\)两点之间的边的边权(如果有重边则视为边权累加)

三.\(Kirchhoff\)(基尔霍夫)矩阵\(L\)
(它也叫\(Laplacian\)(拉普拉斯)矩阵)
\(L_{i,j}=A_{i,j}-B_{i,j}\)
注意不要反了

四.关联矩阵\(M\)
先给这个无向图定向,随便定向即可.

\[M_{i,j}=\begin{cases} 1&点i为第j条边的起点 \\ -1&点i为第j条边的终点\\ 0 &其他情况 \end{cases}\]

矩阵树定理

\(G\)中生成树的边权之和为\(L\)的任意一个代数余子式的行列式(边权为1时就是生成树的个数)
代数余子式:设\(K_{i,j}\)\(L\)的一个代数余子式,则\(K_{i,j}\)\(L\)的行列式删去第\(i\)行第\(j\)列之后的行列式(描述十分不严谨,感性理解一下)

证明

我们先看两个结论
1.\(BB^T=L\)(\(B^T\)\(B\)的转置矩阵)
证明:
\(B^T_{i,j}=B_{j,i}\)
\(BB^T=K\)

\[ K_{i,j}=\sum_{k=1}^n B_{i,k}B^T_{k,j}\\ \ \ \ \ \ \ =\sum_{k=1}^nB_{i,k}B_{j,k}\\ \]

发现算出来就是\(i,j\)之间的边数\(\cdot -1\)

2.设\(C,D\)是两个矩阵(不一定是方阵,但要求\(C\)可以左乘\(D\)),则有
\(|CD|=\sum_{s}C_{sk}D_{ks}\),其中\(s\)为大小为\(n\)的子集(\(n\)是这个矩阵的长和宽的最小值),\(\sum\)后面的东西就是\(C\)只保留子集里面的数对应的列,\(D\)只保留对应的行,乘起来的东西。
证明:我不会证

3.\(L\)矩阵的一些性质
\(|L|=0\)
\(L\)每行每列的和都是0,高斯消元过后,行列式的值就是0
当图不连通时,\(L\)的任意一个余子式\(M_{i,i}\)为0
当图是一棵树时,\(L\)的任意一个余子式\(M_{i,i}\)为1
当图是一棵树时,\(L_{1,1}+1\)后,\(|L|=1\),余子式\(M_{i,i}\)为1
证明感性理解一下叭

我们设\(L_i\)表示\(L\)去掉第\(i\)行第\(i\)列后的矩阵,这样\(|L_i|\)就是\(L\)的一个代数余子式,根据上面的结论,可以得到
\(|L_i|=|B_iB^T_i|\)\(=\sum_sB_{isk}B^T_{iks}=\sum_s B_{isk}^2\),其中\(s\)的大小就是\(n-1\)
一个\(s\)就相当于从原图中找了\(n-1\)条边,结合上面的性质,如果这\(s\)条边可以组成树,则贡献为1,否则为0.枚举完所有的\(s\)之后的总贡献就是生成树是数量

posted @ 2020-06-26 19:14  千载煜  阅读(309)  评论(1编辑  收藏  举报