矩阵树定理学习笔记
矩阵树定理学习笔记
关于行列式,可参考 blog 线性代数部分。
Case 1: 无向图
给定一个无向图,有重边无自环,\(A\) 为其邻接矩阵,\(D\) 为其度数矩阵。
其基尔霍夫矩阵(Kirchhoff)定义为 \(K=D-A\)。
\(\det(K')\) 即为该无向图生成树数量,其中, \(K'\) 为去掉任意第 \(i\) 行,\(i\) 列的基尔霍夫矩阵(\(n-1\) 阶余子式)。
计算 \(\det(K')\) 的过程即高斯消元的过程,复杂度 \(O(n^3)\)。
Case 2: 有向图
给定一个有向图,有重边无自环,\(A\) 为其邻接矩阵,\(D_{in}\) 为其入度矩阵,\(D_{out}\) 为其出度矩阵。
有向图的生成树分内向与外向两种。
若为外向树,\(K=D_{in}-A\),若为内向树,\(K=D_{out}-A\)。
同时由于有向,需要指定根,若根为 \(r\),\(K'\) 去掉的则应是 \(r\) 行,\(r\) 列。
Case 3: 任意模数(行列式)
众所周知,高斯消元需要求逆元,不好做非质数模数。
考虑到我们只是想把下三角矩阵消成0,运用辗转相除法就能做到这一点。
均摊到每一行上,复杂度仍为 \(O(n^3)\)。
扩展
矩阵树定理也可以计算生成森林,添加点0,所有点跟0连一条边权为1的边即可。
证明
学了一点东西,来证一下,或者说解释一下正确性。
这里以有向图内向树情况为例,其他情况类似可得。
我们考虑基尔霍夫矩阵的形式:
\(K_{i,i}\) 为点 \(i\) 的出度,\(K_{i,j},i\neq j\) 为 \(i\to j\) 边的数目的相反数。
考虑行列式为 \(\sum_{p}(-1)^{\tau(p)}\prod_i K_{i,p_i}\)。
若 \(p_i\neq i\),我们认为其选了一条 \(i\to p_i\) 的边且给定一个 \(-1\) 的系数。
否则,我们认为其选了某条 \(i\to j\) 的边且给定一个 \(1\) 的系数。
因为我们去掉了第 \(r\) 行 \(r\) 列,不会选根的出边,而 \(p\) 为一个排列,
故如果选了 \(i\to p_i,p_i\neq i\),那么由于 \(p_i\) 已经存在于排列中了,\(p_{p_i}\) 无法选择 \(p_i\) 自己。
那么最后一定只能形成一个全为 \(-1\) 边的环。
反过来,全 \(1\) 的部分可能为环或一棵树。
考虑如果一个 \(-1\) 环内所有点全部选择自己,能得到一个全为 \(1\) 的环。
对于某个方案中含有全为 \(-1\) 的环,我们可以将其变为全为 \(1\) 的环与其抵消。
但由于偶环 \(-1\) 的情况,我们对于 \(-1\) 环再引入 \((-1)^{l-1}\) 作为一层系数,\(l\) 为环长。
考虑大小为 \(l\) 的环随意交换两个元素成升序排列的最小次数为 \(l-1\)。
由于 \(1\) 的边在置换中是自环,对于整个序列 \(p\),直接求将 \(p\) 交换成升序排列的次数即为系数总共献。
考虑由于交换排列中任意两个数,逆序对的变化一定是个奇数(直接考虑中间部分的贡献变化可得)。
故我们使用 \((-1)^{\tau(p)}\) 当作总系数即可。
科技
众所周知,普通矩阵树定理只能用来计算 \(\sum_T\prod_{i\in T}w_i\)。
其实 \(\sum_T\sum_{i\in T}w_i\) 也是可以求的。
我们考虑将 \(w_i\) 换成一个一次多项式 \(\sum_T\prod_{i\in T}(w_ix+1)\)。
显然,一次项系数即为所求,忽略掉高次项。
具体实现只要将行列式的计算从一个数的计算变成一个 pair 的计算即可。
例题
[SHOI2016]黑暗前的幻想乡
我们实则只有两个要求:
- 所有公司的边形成的图的一棵生成树。
- 该生成树每条边所属公司不同。
第一个条件我们是好计算的,直接上无向图矩阵树定理即可。
但我们直接矩阵树定理计算出的答案是不对的,可能有一个公司承包了多条边。
容斥即可。
复杂度 \(O(2^nn^3)\)。
[JSOI2008]最小生成树计数
一个图的最小生成树有两个性质:
-
所有最小生成树的边权集合相等。
-
所有最小生成树中每种不同边权所连接的连通块是一样的。
我们只需跑出任意一颗最小生成树并将每一种边权跑出方案数乘法原理即可。
这里边权 w 的方案数指用边权为 w 的边使其对应的多个连通块联通的方案数。
由于这个问题是让若干个连通块联通,我们想到生成树计数。
将连通块缩点,加入边权 w 的边后跑矩阵树定理即为所求。
这题的模数为非质数,需要用任意模数的矩阵树定理。
考虑时间复杂度。
记 \(c_i\) 表示边权 \(i\) 在最小生成树中的出现次数。
复杂度为 \(\sum (c_i+1)^3\leq (\sum c_i)^3=(n-1)^3\),即 \(O(n^3)\)。
Best 定理
对于一个有向欧拉图,记点 \(i\) 的出度为 \(\text{out}_i\),其本质不同的欧拉回路个数为:
\(T\) 为图以某点为根的内向生成树个数(欧拉图中以任意一点为根的内向生成树数量相同)。
证明
记 \(s\) 为起点。
对于一条欧拉回路,我们把所有点的最后一条出边拿出来去除掉 \(s\) 的出边,一定形成一棵以 \(s\) 为根的内向树。
原因是如果成环,由于所有点出度等于入度,环上最后走的一条边到达的位置仍会有一条出边未走,矛盾。
此时其他所有非树边随便排列顺序,但根有一点区别,从根出发的非树边有 \(out_s\) 条,全部重排应该是 \(out_s!\),但一个大小为 \(out_s\) 的出边的排列,我们对他进行 \(out_s\) 次轮换实际上回路没有本质改变。
最后一条本质相同的的回路将被算 \(out_s\) 次,最终除掉即可。
从 \(s\) 出发按选择的出边顺序走,最后走树边由于出度等于入度,一定能走完所有边。
由于所有点的最后一条出边中一定有欧拉回路顺序中的最后一条边,该条边一定回到 \(s\),得到回路。