首先推荐 GJS学长 的这篇博文: http://www.cnblogs.com/meowww/p/6485422.html .
Matrix-Tree 定理
度数矩阵 $D$ . $D_{i, i} = i 的度数$ .
邻接矩阵 $G$ . $G_{i, j}$ 表示 $i$ 到 $j$ 的连边数量.
基尔霍夫矩阵 $K$ , $K = D - G$ .
边矩阵 $B[m \times n]$ , 每行代表一条边, 对应位置的值为 $1$ .
$B ^ T B = K$ .
$B_i ^ T B_i = K_i$ .
其中 $B_i$ 是 $B$ 去掉第 $i$ 行第 $i$ 列的代数余子式, $K_i$ 同理.
说明 每行可以贡献在 4 个基尔霍夫矩阵的对应位置.
Matrix-Tree 定理:
$原图的生成树个数 = |K_i|$ .
一般我们在计算的时候, 去掉最后一行最后一列, 然后用高斯消元的方法在 $O(n ^ 3)$ 求解.
基尔霍夫矩阵有一定的小性质.
1. $|K| = 0$ .
证明 把所有都加到第一行.
2. 若图不连通, $|K_i| = 0$ .
证明 通过两次交换可以交换编号.
利用该原理进行重编号.
将矩阵分快, 一定有一个联通块是完整的基尔霍夫矩阵.
3. 若该图是一棵树, 那么 $|K_i| = 1$ .
证明 归纳法, 边界显然成立.
交换编号, 使得一个度数为 1 的节点放在最后一位, 加上去, 然后按最后一列展开, 根据归纳假设得证.
常规证明
根据 Cauchy-Binet 公式 ( 描述了行列式的值与矩阵乘法的关系 ) , $|K_i| = |B_i ^ T B_i| = \sum |选择 n-1 条边组成的基尔霍夫矩阵的余子式|$ .
注意到对于 n-1 条边, 图要么不连通, 要么是一棵树.
所以 $K_i = 生成树个数$ .
另一种证明
去除掉第一行第一列, 那么剩余的矩阵类似一个除去了点 1 的基尔霍夫矩阵, 除了主对角线的每个与点 1 连通的位置有一个 $\Delta$ .
考虑按照线性性质展开, 通过交换编号同理可说明, 最后所有与点 1 连通的位置会剩下 $\Delta$ , 其他位置没有影响.
我们可以按照所有 $\Delta$ 展开, 得到了 $\Delta$ 的乘积 * 若干个不连通的块的基尔霍夫矩阵的余子式.
根据归纳假设, 得证.
这种方法从本质上把指数级别的暴力融入了行列式中, 类似的思想还有 Lindstorm - Gessel - Viennot 引理.
推广
推广1 计算边权的乘积之和.
如果边权都是整数, Matrix-Tree定理支持带有重边的图, 我们把每条边权 w 当做 w 条边, 然后跑 Matrix-Tree 即可.
如果边权是有理数, 设 $t$ 为边权的最小公倍数, 我们给每个值乘上 $t$ , 然后再外界除以 $t ^ n$ , 再把 $t ^ n$ 扔进去, 就证明了 Matrix-Tree 定理对所有有理数都成立.
推广2 有向图生成树计数
基尔霍夫矩阵不再对称, 但仍然使用.