Loading

矩阵树定理

没有证明,快逃。

概念

矩阵树定理,用于一类图论问题的生成树计数。

通常给出一个有向图或无向图,需要求出图中的 内向生成树 / 外向生成树 / 生成树的 个数 / 权值乘积之和等。

这类问题可以通过矩阵树定理转化成行列式求值。

时间复杂度 \(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))\),可能略微卡常。

posted @ 2023-02-14 18:28  kymru  阅读(53)  评论(0编辑  收藏  举报