矩阵树定理学习笔记

矩阵树定理学习笔记

真的,我这辈子都没有想过行列式还能用到这种地方。

定义

图的关联矩阵

对于一张有 \(n\) 个点、\(m\) 条边的图(对于无向图,可以随便定义边的方向,因为相反的边只需要将对应列乘以 \(-1\) 即可),我们定义其关联矩阵 \(M\) 满足:

\[M_{i,j}=\left\{\begin{matrix}1&e_j是节点i的入边\\-1&e_j是节点i的出边\\0&\text{otherwise}\end{matrix}\right. \]

大小是 \(n\times m\) 的。

基尔霍夫矩阵

一张图的基尔霍夫矩阵 \(L\) 定义为:

\[L_{i,j}=\left\{\begin{matrix}\text{deg}(i)&i=j\\-\text{cnt}(i,j)&i\ne j\end{matrix}\right. \]

其中 \(\text{deg}(i)\) 表示节点 \(i\) 的度数(既包含入度,也包含出度),\(\text{cnt}(i,j)\) 表示节点 \(i,j\) 之间连边的条数。更具体的,对于一张图的度数矩阵 \(D\) 和邻接矩阵 \(A\),则 \(L=D-A\),由此我们就可以在 \(O(m)\) 的时间内直接求解矩阵 \(L\)

关于矩阵 \(L\) 还有一个性质:\(L=MM^T\)

证明:

\[\begin{aligned}L_{i,i}&=\sum_{k=1}^{m}M_{i,k}M^T_{k,i}\\&=\sum_{k=1}^{m}M_{i,k}^2\\&=\text{deg}(i)\end{aligned}, \begin{aligned}L_{i,j}&=\sum_{k=1}^{m}M_{i,k}M^T_{k,j}\\&=\sum_{k=1}^{m}M_{i,k}M_{j,k}\\&=-\text{cnt}(i,j)\end{aligned} \]

\(M_{i,k}\) 有值时,就会给 \(L_{i,i}\) 增加贡献,显然这样的点有 \(\text{deg}(i)\) 个,贡献为 \(\text{deg}(i)\)

\(M_{i,k},M_{j,k}\) 均有值时,就会给 \(L_{i,j}\) 增加贡献,显然两者一个为 \(1\),一个为 \(-1\),所以总共献为 \(-\text{cnt}(i,j)\)

定理

关联矩阵与图性质的关系

选出一棵树的过程本质上就是选出 \(n-1\) 条边,那么我们从这 \(m\) 列中取出 \(n-1\) 列作为选边,并判断这样的选边是否合适。令选边集合为 \(S\) 时得到的新矩阵为 \(M[S]\),大小显然是 \(n\times(n-1)\) 的。但这样的矩阵不如方阵好研究,因此不如去掉一行。可以证明,去掉一行后整个矩阵维护的信息不会缺失(因为每一列只有两个位置可能有值,并且相加为 \(0\)),那么不妨将这样的矩阵称做 \(M_0[S]\)。考虑什么样的情况能够使得这样的方阵合法,当选出的方案中有环时,那么矩阵 \(M[S]\) 所表示的向量组一定是线性相关的,那么 \(M_0[S]\) 所表示的向量组一定是线性相关的,所以有 \(\text{det}(M_0[S])=0\)。相反的,对于合法的选点,\(\text{det}(M_0[S])=\pm1\)。考虑对于一个未被去除的叶子节点(一棵树至少有两个叶子节点,因此一定有未被去除的节点),显然这一行只有一个非零元素,用这一行进行消元,那么一定有当前行和列均只有一个非零元素,不妨将这一行和这一列忽略,考虑剩下的方阵,显然这样相当于忽略了一条边,那么一定会有新的叶子节点。那么消元后的方阵一定每一行和每一列均只有一个非零元素,那么行列式就是它们的乘积或者乘积的相反数,不难看出值仅可能为 \(\pm 1\)

柯西-比内定理

如果 \(A\)\(n\times m\) 的矩阵,\(B\)\(m\times n\) 的矩阵,那么:

\[\text{det}(AB)=\sum_{S\subseteq\{1,2,\cdots,m\}\wedge |S|=n}\text{det}(A[S])\text{det}(B[S]) \]

矩阵树定理

令去除掉第 \(i\) 行第 \(i\) 列的矩阵 \(L\)\(L_0\),去掉第 \(i\) 行的矩阵为 \(M_0\)。因为 \(L=MM^T\),所以 \(L_0=M_0M_0^T\)。那么根据柯西-比内定理可得:

\[\begin{aligned}\text{det}(L_0)&=\text{det}(M_0M_0^T)\\&=\sum_{S\subseteq\{1,2,\cdots,m\}\wedge|S|=n-1}\text{det}(M_0[S])\text{det}(M_0^T[S])\\&=\sum_{S\subseteq\{1,2,\cdots,m\}\wedge|S|=n-1}\text{det}(M_0[S])^2\end{aligned} \]

根据刚才推导的内容,\(S\) 显然是一种选边方案,而 \(\text{det}(M_0[S])^2\) 是否为 \(1\) 取决于选边方案是否构成一棵树,如果是一棵树,那么答案就被统计,反之则不统计。那么 \(\text{det}(L_0)\) 的含义即为生成树的个数。 显然 \(L_0\) 能够快速求解,而求行列式的复杂度是 \(O(n^3)\) 的,因此求解生成数个数的复杂度为 \(O(n^3)\)​。

关于有向图的拓展

因为有向图被恶意规定了方向,因此不能像往常一样建图,不然会导致边的关系紊乱(因为不管指向哪边都一样)。因此我们应当重新定义矩阵:

\[L_{i,j}=\left\{\begin{matrix}\text{deg}_\text{in}(i)&i=j\\-\text{cnt}(i\to j)&i\ne j\end{matrix}\right. \]

其中 \(\text{deg}_\text{in}(i)\) 表示 \(i\) 节点的入度。

更特别的,对于有向图来说,推导的过程实际上是有问题的,因为有向树分为外向树和内向树。外向树指的是所有的边由父亲指向儿子,而内向树则是所有的边由儿子指向父亲,不管哪一种,都有明显的根。因此如果随便去除某一行,那么可能导致当前方阵没有叶子节点,那么推导便失败了。因此,我们需要求以哪一个节点为根的有向树,便需要去掉哪一行。

然而此时的 \(L\ne MM^T\),因此我们需要重新找到两个矩阵使它们的乘积等于 \(L\)

考虑到 \(\text{det}(M_0[S])\) 其实保证了当边的形状是树形的时候的值,从而保证了统计的正确性。但有向树不仅要求边的形状,同时要求的边的方向,我们考虑通过另一个矩阵来维护这一点。我们首先考虑外向树的性质:除根节点外,每个节点有且仅有一个入边,也就是说,叶子结点的那一行有且仅有一个元素 \(1\),那么边为树形时 \(\text{det}(M_0[S])=1\)。我们只需要让矩阵 \(D\) 满足当且仅当每个除根节点外的点有且仅有一个入边时 \(\text{det}(D_0[S])=1\) 成立即可。

不难看出,矩阵 \(D\) 满足:

\[D_{i,j}=\left\{\begin{matrix}1&e_j为i的入边\\0&\text{otherwise}\end{matrix}\right. \]

并且此时 \(L=MD^T\),并且 \(L=D-A\)\(D\) 为度数矩阵)​​,因此可以求解。

证明

\[\begin{aligned}L_{i,i}&=\sum_{k=1}^{m}M_{i,k}D^T_{k,i}\\&=\sum_{k=1}^{m}M_{i,k}D_{i,k}\\&=\text{deg}_\text{in}(i)\end{aligned}, \begin{aligned}L_{i,j}&=\sum_{k=1}^{m}M_{i,k}D^T_{k,j}\\&=\sum_{k=1}^{m}M_{i,k}D_{j,k}\\&=-\text{cnt}(i\to j)\end{aligned} \]

对于内向树来说,将所有边调转方向即可得到外向树,因此反向建边后求解外向树的个数即可。

树的权值和

如果一棵树的权值定义为所有边的边权相乘,要求求解所有生成树的权值和。不难发现,如果将权值当成重边,那么在边的形状固定的情况下,根据乘法原理,此时的总情况为每一条边重合的边数相乘,也就是说,求解树的权值和和求解生成树个数完全等价。

posted @ 2024-05-29 21:19  DycIsMyName  阅读(4)  评论(0编辑  收藏  举报