矩阵树定理
在\(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\)
先给这个无向图定向,随便定向即可.
矩阵树定理
图\(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\)
发现算出来就是\(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\)之后的总贡献就是生成树是数量