在(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)之后的总贡献就是生成树是数量