矩阵树定理学习笔记
真的,我这辈子都没有想过行列式还能用到这种地方。
定义
图的关联矩阵
对于一张有 个点、 条边的图(对于无向图,可以随便定义边的方向,因为相反的边只需要将对应列乘以 即可),我们定义其关联矩阵 满足:
大小是 的。
基尔霍夫矩阵
一张图的基尔霍夫矩阵 定义为:
其中 表示节点 的度数(既包含入度,也包含出度), 表示节点 之间连边的条数。更具体的,对于一张图的度数矩阵 和邻接矩阵 ,则 ,由此我们就可以在 的时间内直接求解矩阵 。
关于矩阵 还有一个性质:。
证明:
当 有值时,就会给 增加贡献,显然这样的点有 个,贡献为 。
当 均有值时,就会给 增加贡献,显然两者一个为 ,一个为 ,所以总共献为 。
定理
关联矩阵与图性质的关系
选出一棵树的过程本质上就是选出 条边,那么我们从这 列中取出 列作为选边,并判断这样的选边是否合适。令选边集合为 时得到的新矩阵为 ,大小显然是 的。但这样的矩阵不如方阵好研究,因此不如去掉一行。可以证明,去掉一行后整个矩阵维护的信息不会缺失(因为每一列只有两个位置可能有值,并且相加为 ),那么不妨将这样的矩阵称做 。考虑什么样的情况能够使得这样的方阵合法,当选出的方案中有环时,那么矩阵 所表示的向量组一定是线性相关的,那么 所表示的向量组一定是线性相关的,所以有 。相反的,对于合法的选点,。考虑对于一个未被去除的叶子节点(一棵树至少有两个叶子节点,因此一定有未被去除的节点),显然这一行只有一个非零元素,用这一行进行消元,那么一定有当前行和列均只有一个非零元素,不妨将这一行和这一列忽略,考虑剩下的方阵,显然这样相当于忽略了一条边,那么一定会有新的叶子节点。那么消元后的方阵一定每一行和每一列均只有一个非零元素,那么行列式就是它们的乘积或者乘积的相反数,不难看出值仅可能为 。
柯西-比内定理
如果 是 的矩阵, 是 的矩阵,那么:
矩阵树定理
令去除掉第 行第 列的矩阵 为 ,去掉第 行的矩阵为 。因为 ,所以 。那么根据柯西-比内定理可得:
根据刚才推导的内容, 显然是一种选边方案,而 是否为 取决于选边方案是否构成一棵树,如果是一棵树,那么答案就被统计,反之则不统计。那么 的含义即为生成树的个数。 显然 能够快速求解,而求行列式的复杂度是 的,因此求解生成数个数的复杂度为 。
关于有向图的拓展
因为有向图被恶意规定了方向,因此不能像往常一样建图,不然会导致边的关系紊乱(因为不管指向哪边都一样)。因此我们应当重新定义矩阵:
其中 表示 节点的入度。
更特别的,对于有向图来说,推导的过程实际上是有问题的,因为有向树分为外向树和内向树。外向树指的是所有的边由父亲指向儿子,而内向树则是所有的边由儿子指向父亲,不管哪一种,都有明显的根。因此如果随便去除某一行,那么可能导致当前方阵没有叶子节点,那么推导便失败了。因此,我们需要求以哪一个节点为根的有向树,便需要去掉哪一行。
然而此时的 ,因此我们需要重新找到两个矩阵使它们的乘积等于 。
考虑到 其实保证了当边的形状是树形的时候的值,从而保证了统计的正确性。但有向树不仅要求边的形状,同时要求的边的方向,我们考虑通过另一个矩阵来维护这一点。我们首先考虑外向树的性质:除根节点外,每个节点有且仅有一个入边,也就是说,叶子结点的那一行有且仅有一个元素 ,那么边为树形时 。我们只需要让矩阵 满足当且仅当每个除根节点外的点有且仅有一个入边时 成立即可。
不难看出,矩阵 满足:
并且此时 ,并且 ( 为度数矩阵),因此可以求解。
证明:
对于内向树来说,将所有边调转方向即可得到外向树,因此反向建边后求解外向树的个数即可。
树的权值和
如果一棵树的权值定义为所有边的边权相乘,要求求解所有生成树的权值和。不难发现,如果将权值当成重边,那么在边的形状固定的情况下,根据乘法原理,此时的总情况为每一条边重合的边数相乘,也就是说,求解树的权值和和求解生成树个数完全等价。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通