矩阵树定理学习笔记

矩阵树定理学习笔记

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

定义

图的关联矩阵

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

Mi,j={1eji1eji0otherwise

大小是 n×m 的。

基尔霍夫矩阵

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

Li,j={deg(i)i=jcnt(i,j)ij

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

关于矩阵 L 还有一个性质:L=MMT

证明:

Li,i=k=1mMi,kMk,iT=k=1mMi,k2=deg(i),Li,j=k=1mMi,kMk,jT=k=1mMi,kMj,k=cnt(i,j)

Mi,k 有值时,就会给 Li,i 增加贡献,显然这样的点有 deg(i) 个,贡献为 deg(i)

Mi,k,Mj,k 均有值时,就会给 Li,j 增加贡献,显然两者一个为 1,一个为 1,所以总共献为 cnt(i,j)

定理

关联矩阵与图性质的关系

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

柯西-比内定理

如果 An×m 的矩阵,Bm×n 的矩阵,那么:

det(AB)=S{1,2,,m}|S|=ndet(A[S])det(B[S])

矩阵树定理

令去除掉第 i 行第 i 列的矩阵 LL0,去掉第 i 行的矩阵为 M0。因为 L=MMT,所以 L0=M0M0T。那么根据柯西-比内定理可得:

det(L0)=det(M0M0T)=S{1,2,,m}|S|=n1det(M0[S])det(M0T[S])=S{1,2,,m}|S|=n1det(M0[S])2

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

关于有向图的拓展

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

Li,j={degin(i)i=jcnt(ij)ij

其中 degin(i) 表示 i 节点的入度。

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

然而此时的 LMMT,因此我们需要重新找到两个矩阵使它们的乘积等于 L

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

不难看出,矩阵 D 满足:

Di,j={1eji0otherwise

并且此时 L=MDT,并且 L=DAD 为度数矩阵)​​,因此可以求解。

证明

Li,i=k=1mMi,kDk,iT=k=1mMi,kDi,k=degin(i),Li,j=k=1mMi,kDk,jT=k=1mMi,kDj,k=cnt(ij)

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

树的权值和

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

posted @   DycIsMyName  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示