算法学习笔记(25): 矩阵树定理

算法,学习,笔记,矩阵,定理 · 浏览次数 : 14

小编点评

**矩阵树定理** 矩阵树定理是无向图的矩阵树定理的推广。其主要应用于计算无向图中所有路径的长度和权重之和。 **无向图矩阵树定理** 对于无向图 \\(A\\),其矩阵树定理如下: $$\sum_{T} \prod_{e \in T} w_e = \det(D - A)$$ 其中: * \\(T\\) 是所有简单路径的集合 * \\(e\\) 是所有路径中的边 * \\(w_e\\) 是每条边的权重 * \\(D\\) 是度数矩阵 * \\(A\\) 是邻接矩阵 **矩阵树定理的推导** 矩阵树定理可由以下公式推导: $$D_{i, i} = \sum_j w(i, j)$$ 其中 \\(D_{i, i}\\) 是度数矩阵 \\(D\\) 的对角元素, \\(w(i, j)\\) 是边 \\(i \\to j\\) 的边权。 **矩阵树定理的应用** 矩阵树定理可以用于计算无向图中所有路径的长度和权重之和。例如,以下代码计算无向图 \\(A\\) 中所有简单路径的长度和权重之和: ```python def matrix_tree_sum(A): # 初始化结果矩阵 result = [[0 for _ in range(len(A[0])) for _ in range(len(A))] for _ in range(len(A))] # 计算每个节点的度数 for i in range(len(A)): for j in range(len(A[0])): result[i][j] = sum([A[i][k] for k in range(len(A)) if k != j]) # 计算所有路径的长度和权重之和 for path in all_paths(A): result[0][0] += product([A[i][j] for i, j in path]) return result[0][0] ``` **结论** 矩阵树定理是无向图矩阵树定理的推广,可以用于计算无向图中所有路径的长度和权重之和。

正文

矩阵树定理

本文不作为教学向文章。

比较好的文章参考:

对于无向图

无向图中应该是矩阵树定理的常用场景。

无向图的矩阵树定理讲的是:

\[\sum_{T} \prod_{e \in T} w_e \]

求行列式的矩阵为 \(D - A\),也就是度数矩阵 \(D\) 减去邻接矩阵 \(A\)

其中 \(A_{i, j} = \sum w(i, j)\),也就是 \(i \to j\) 的边的边权之和(允许重边)。

其中 \(D_{i, i} = \sum_j w(i, j)\),也就是所有通向 \(i\) 的边的边权之和。

这好像在无向图中也适用。

如果我们需要计数的话,就把边权设为 \(1\) 即可。


[SDOI2014]重建 - 洛谷 中,求的是 \(\sum_T \prod_{e \in T} p_e \prod_{e \not\in T} (1 - p_e)\)

我们可以轻易的把 \(\prod_{e \not\in T} (1 - p_e)\) 它变为 \(\cfrac {\prod_e (1 - p_e)}{\prod_{e \in T} (1 - p_e)}\)

剩下的就简单了。于是余下的是建矩阵的问题。

根据上面所说,也很简单了。


对于有向图

\(A, D\) 的定义与上面类似。

只是注意两个点:

  • 内向树和外向树

在求 \(\det\) 的时候需要删掉一行,删掉的那一行作为的是根!

内向树和外向树?内向即是指向根的方向,外向即是根向外指。

此时 \(D\) 需要有变化:\(D_{i, i} = \sum_j w(i, j)\) 就是根向外指,是外向树。如果为 \(\sum_j w(j, i)\) 则是内向树。

无向图中随意,因为无论外向还是内向结果都是一样的。

与算法学习笔记(25): 矩阵树定理相似的内容:

算法学习笔记(25): 矩阵树定理

# 矩阵树定理 > 本文不作为教学向文章。 > > 比较好的文章参考: > > - [矩阵树-定理以及凯莱公式](https://zhuanlan.zhihu.com/p/593934554) > > - [【学习笔记】矩阵树定理(Matrix-Tree)_繁凡さん的博客-CSDN博客](https

算法学习笔记(8.0): 网络流前置知识

网络流基础 网络流合集链接:网络流 网络 $G = (V, E)$ 实际上是一张有向图 对于图中每一条有向边 $(x, y) \in E$ 都有一个给定的容量 $c(x, y)$ 特别的,若 $(x,y) \notin E$ , 则 $c(x, y) = 0$ 图中还有两个指定的特殊结点,$S, T

算法学习笔记(6): 树链剖分

树链剖分 树链剖分是一个很神奇,但是在树上可以完成一些区间操作问题 简单来说,就是把一棵树分成一条条的链,通过维护链上的信息来维护整棵树的信息 基础知识可以参考我的另外一篇博客:算法学习笔记(5): 最近公共祖先(LCA) 这里假设你已经掌握了上述博客中的所有相关知识,并清晰了其背后的原理 性质?发

算法学习笔记(11): 原根

原根 此文相对困难,请读者酌情食用 在定义原根之前,我们先定义其他的一点东西 阶 通俗一点来说,对于 $a$ 在模 $p$ 意义下的阶就是 $a^x \equiv 1 \pmod p$ 的最小正整数解 $x$ 或者说,$a$ 在模 $p$ 意义下生成子群的阶(群的大小) 再或者说,是 $a$ 在模

算法学习笔记(30):Kruskal 重构树

Kruskal 重构树 这是一种用于处理与最大/最小边权相关的一个数据结构。 其与 kruskal 做最小生成树的过程是类似的,我们考虑其过程: 按边权排序,利用并查集维护连通性,进行合并。 如果我们在合并时,新建一个节点,其权值为当前处理的边的权值,并将合并的两个节点都连向新建的节点,那么就可以得

算法学习笔记(3.1): ST算法

ST表 在RMQ(区间最值)问题中,著名的ST算法就是倍增的产物。ST算法可以在 \(O(n \log n)\) 的时间复杂度能预处理后,以 \(O(1)\) 的复杂度在线回答区间 [l, r] 内的最值。 当然,ST表不支持动态修改,如果需要动态修改,线段树是一种良好的解决方案,是 \(O(n)\

C++算法之旅、09 力扣篇 | 常见面试笔试题(上)算法小白专用

算法学习笔记,记录容易忘记的知识点和难题。详解时空复杂度、50道常见面试笔试题,包括数组、单链表、栈、队列、字符串、哈希表、二叉树、递归、迭代、分治类型题目,均带思路与C++题解

C++算法之旅、08 基础篇 | 质数、约数

算法学习笔记,记录容易忘记的知识点和难题。试除法、分解质因数、筛质数、约数个数、约数之和、最大公约数

算法学习笔记(1): 欧几里得算法及其扩展

扩展欧几里得算法详解 在了解扩欧之前我们应该先了解欧几里得算法 欧几里得算法 这是一个递归求最大公约数(greatest common divisor)的方法 $$ gcd(a, b) = gcd(b, a % b) $$ 可以通过一个类似的简单公式推导而来 好像叫做辗转相减法来着? $$ gcd(

算法学习笔记(3): 倍增与ST算法

倍增 目录倍增查找 洛谷P2249重点变式练习快速幂ST表扩展 - 运算扩展 - 区间变式答案倍增更多的用法优化矩形查询优化建图优化 DP作者有话说 倍增,字面意思即”成倍增长“ 他与二分十分类似,都是基于”2“的划分思想 那么具体是怎么样,我们以一个例子来看 查找 洛谷P2249 依据题面,我们知