矩阵树定理
没有证明,快逃。
概念
矩阵树定理,用于一类图论问题的生成树计数。
通常给出一个有向图或无向图,需要求出图中的 内向生成树 / 外向生成树 / 生成树的 个数 / 权值乘积之和等。
这类问题可以通过矩阵树定理转化成行列式求值。
时间复杂度 \(O(n^3)\).
内容
以无向图为例。
令 \(D\) 为无向图的度数矩阵,\(D[i][j] = \begin{cases} \operatorname{deg(i)}, &i = j \\ 0, &i \neq j \end{cases}\).
令 \(A\) 为无向图的邻接矩阵,\(A[i][j] = \sum\limits_{(u, v) \in E} [u = i, v = j]\).
则该无向图的基尔霍夫(Kirchoff)矩阵为 \(D - A\).
矩阵树定理:该无向图以 \(r\) 为根的生成树个数 等价于 基尔霍夫矩阵去掉第 \(r\) 行第 \(r\) 列得到的行列式的值。
具体证明不会,懒得学了,可能也学不会。
对于有向图:
-
求外向生成树个数:令 \(D\) 为入度矩阵。
-
求内向生成树个数:令 \(D\) 为出度矩阵。
变式:定义生成树的权值为其中所有边权的乘积,求图中所有生成树的权值之和。
实际上矩阵树定理等价于求 \(\sum\limits_{T} \prod\limits_{(u, v) \in T} w(u, v)\).
所以只需要令 \(D[i][j] = \begin{cases} \sum\limits_{(i, k) \in G} w(i, k), &i = j \\ 0, &i \neq j \end{cases}\).
令 \(A[i][j] = \sum\limits_{(i, j) \in G} w(i, j)\).
这样就可以直接套用矩阵树定理求了。
模数不为 \(0\) 的时候直接辗转相除求,时间复杂度是 \(O(n^2 (n + \log n))\),可能略微卡常。