矩阵树定理学习笔记
真的,我这辈子都没有想过行列式还能用到这种地方。
定义
图的关联矩阵
对于一张有 \(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)\)。
关于有向图的拓展
因为有向图被恶意规定了方向,因此不能像往常一样建图,不然会导致边的关系紊乱(因为不管指向哪边都一样)。因此我们应当重新定义矩阵:
其中 \(\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} \]对于内向树来说,将所有边调转方向即可得到外向树,因此反向建边后求解外向树的个数即可。
标签:text,定理,det,笔记,节点,矩阵,aligned,sum From: https://www.cnblogs.com/DycBlog/p/18221105