用来求和一个图的生成树个数相关的算法,时间复杂度 \(O(n^3)\)。
你要会求一个矩阵的行列式,这是 和行列式有关的前置知识。
定理阐述
对于无向图
定义度数矩阵 \(D_{i,j}=[i=j]\deg_i\),其中 \(\deg_i\) 表示 \(i\) 的度数。
定义邻接矩阵为 \(E_{i,j}\) 为边 \((i,j)\) 的个数。
定义 Kirchhoff 矩阵为 \(L=D-E\),则把 \(L\) 去掉第 \(i\) 行和第 \(i\) 列(\(i\) 是这棵树的根,因为是无向图,所以随意),这个无向图的生成树个数为剩下矩阵的行列式。
对于内向生成树
定义度数矩阵 \(D_{i,j}=[i=j]\deg_i\),其中 \(\deg_i\) 表示 \(i\) 的出度。
定义邻接矩阵为 \(E_{i,j}\) 为边 \((i,j)\) 的个数。
定义 Kirchhoff 矩阵为 \(L=D-E\),则把 \(L\) 去掉第 \(i\) 行和第 \(i\) 列(\(i\) 是这棵树的根),这个无向图的生成树个数为剩下矩阵的行列式。
对于外向生成树
定义度数矩阵 \(D_{i,j}=[i=j]\deg_i\),其中 \(\deg_i\) 表示 \(i\) 的如度。
定义邻接矩阵为 \(E_{i,j}\) 为边 \((i,j)\) 的个数。
定义 Kirchhoff 矩阵为 \(L=D-E\),则把 \(L\) 去掉第 \(i\) 行和第 \(i\) 列(\(i\) 是这棵树的根),这个无向图的生成树个数为剩下矩阵的行列式。
利用行列式性质的证明
只证明无向图的情况,对于内向生成树和外向生成树的情况是类似的。
行列式:\(\det(A)=\sum _{p_{1,2\dots n}} (-1)^{\pi(p)} \prod _{i=1}^n a_{i,p_i}\)。
钦定父亲,也就是行列式里枚举的排列,后面的连乘数值上这种情况的方案数,当 \(p_i=i\) 时表示点 \(i\) 可以随便选父亲,因此有度数种情况。
如果出现了环,假设长度为 \(k\),那么这个环对 \((-1)^{\pi(p)}\) 的影响是 \((-1)^{k-1}\) 的。但由于 Kirchhoff 矩阵为 \(L=D-E\),边权乘了 \(-1\),所以它实际上对系数的影响是 \((-1)^{2k-1}=-1\)。
一个环对系数的影响是 \(-1\),可以看作容斥系数,所以行列式的值就是生成树的个数。
BEST 定理
对于一个有向欧拉图,不同的欧拉回路个数是所有点入度减一的阶乘的乘积,乘以内向生成树的个数。
标签:定义,矩阵,定理,个数,笔记,生成,行列式,deg From: https://www.cnblogs.com/fydj/p/-/MatrixTree