Matrix tree定理用于连通图生成树计数,由于博主太菜看不懂定理证明,所以本篇博客不提供\(Matrix\ tree\)定理的证明内容(反正这个东西背结论就可以了是吧)

理解\(Matrix\ tree\)定理需要一定的线性代数知识(当然不会也没关系)

a.前置芝士——行列式

稍微费点笔墨写写行列式

行列式是一个\(N \times N\)的方阵,比如说下面就是一个\(3 \times 3\)的行列式

\(\left|\begin{array}{cccc} 1 & 6 & 9 \\ 7 & 0 & 7\\ 9 & 4 & 3 \end{array}\right|\)

下面我们统一某一个矩阵第\(i\)行第\(j\)列的元素为\(a_{i,j}\)

当然,行列式相比于矩阵的不同之处在于:行列式虽然长成了一个矩阵的样子,但它代表的是一个值,这个值的定义为\(\sum\limits_p s(p) \times \sum\limits_{i=1}^N a_{i,p_i}\),其中\(p\)是一个排列,\(s(p)=-1^{f(p)}\),\(f(p)\)等于排列\(p\)的逆序对数。

行列式有几个性质:

\(1.\)交换行列式的两行或者两列,行列式的值取相反数

\(2.\)给行列式的一行或一列的所有数同时乘上同一个值,行列式的值也会乘上这一个值

\(3.\)将一行列式的某一行(列)乘若干倍加到另一行(列)上,行列式的值不变

上面这些性质有什么用捏……定义中行列式的求值是\(O(n \times n!)\)的,有没有多项式做法呢……

我们可以使用类似于高斯消元的方法用\(O(n^3)\)的复杂度解决这个问题。可以发现我们在高斯消元中做的所有操作在行列式性质中都有相应的变换。

那么我们将其通过与高斯消元相同的方法将行列式变为上三角型(也就是\(i>j \rightarrow a_{i,j}=0\)的行列式),此时在定义式中能产生贡献的只有\(1,2...n\)排列,对应行列式对角线上的值的乘积。

上面说得比较浅显,如果不理解建议自行阅读《线性代数》相关内容

b.Matrix tree定理内容

对于一张连通无向图,定义其度数矩阵为矩阵\(a_{i,j}\),其中\(a_{i,j} = \left\{\begin{array}{rcl} d_i, & i=j \\ 0, & i \neq j \end{array}\right.\),用度数矩阵减去邻接矩阵得到基尔霍夫矩阵,划去基尔霍夫矩阵的第\(x\)行与第\(y\)列(\(x,y\)任意选定)得到一个新的行列式,这个行列式的值乘上\((-1)^{x+y}\)就是这个无向图的生成树数量。当然了为了方便一般就划掉第\(1\)行第\(1\)列或者第\(N\)行第\(N\)列。

这种东西暂时还不会证呢qwq

JSOI2008 最小生成树计数

先撸出一棵最小生成树出来,对于边权相等的边统一计算。在计算边权为某一个值的答案时,将最小生成树上其他的边连起来,将一个连通块看作一个点,将这一些边权相等的边与这些点看作新图,在新图上跑生成树计数,所有边权的答案的乘积就是最后答案

注意到这道题的模数比较NB,并不是一个质数,这意味着不能乘逆元。我们可以用类似辗转相除法的思路进行计算。对于当前需要减的两行,通过辗转相除计算系数与交换行的次数,然后再带入这两行中。

注意必须要将最小生成树上其他的边连起来,因为对于不连通的图矩阵行列式的值会等于\(0\)。

代码

c.Matrix tree定理的一些拓展

有向图Matrix tree定理

对于外向生成树,度数矩阵变为入度矩阵;对于内向生成树,度数矩阵变为出度矩阵;如果生成树根为\(x\),则必须划掉第\(x\)行与第\(x\)列 ,其他与无向图Matrix tree定理一致。

如果记不得内外向生成树分别对应入度还是出度矩阵,就两个都试一下就好了

CQOI2018 社交网络

裸题,代码

所有生成树边权乘积的和

考虑如果边权都是整数,可以把边权为\(w\)的边看成\(w\)条重边,可以直接用定理,有理数每一行乘上分母的\(lcm\)将所有边权都乘成整数然后最后将答案除掉\(lcm^{N-1}\),那么Matrix tree定理显然也是正确的

所以一条边对度数矩阵和邻接矩阵的影响值都是它的边权。

SDOI2014 重建

设题目给出的边集为\(E\),某一棵生成树的边集为\(e\)

那么这一棵生成树的贡献是\(\prod\limits_{(u,v) \in e} G_{u,v} \times \prod\limits_{(u,v) \in E \&\& (u,v) \not\in e}(1-G_{u,v})=\prod\limits_{(u,v) \in E} (1 - G_{u,v}) \times \prod\limits_{(u,v) \in e} \frac{G_{u,v}}{1 - G_{u,v}}\)

然后套上板子就可以了

代码

所有生成树边权和的和

注意这个和上面那个是不一样的

Matrix-Tree定理原本用来计算所有生成树边权的乘积的和,直接让它计算所有生成树边权的的和,看起来似乎不可做

但实际上,可以利用多项式相关知识解决。值得注意的是,Matrix-Tree定理不仅适用于边权为有理数的情况,在边权是一个多项式的情况下Matrix-Tree定理仍然可以使用。

我们将一条边权为\(w\)的边看做一条边权为\(wx+1\)的边,注意后面是一个多项式,那么我们需要求的就是所有生成树的边权的乘积的和的一次项的值。

因为只需要求一次项,所以我们可以在\(\mod x^2\)的意义下解决,在这个意义下求逆也是很方便的(对于\(ax+b\),其逆\(cx+d\)只需要满足\(bd \mod mod = 1 , bc + ad \mod mod = 0\)),那么也能很快地求出行列式的值。

仍然需要注意:一条边对邻接矩阵和度数矩阵的影响值都是其边权

这里是一个求一个有向图所有外向生成树的边权和的和的sample

一篇自己都看不懂的Matrix tree总结的更多相关文章

  1. 一篇自己都看不懂的CDQ分治&整体二分学习笔记

    作为一个永不咕咕咕的博主,我来更笔记辣qaq CDQ分治 CDQ分治的思想还是比较简单的.它的基本流程是: \(1.\)将所有修改操作和查询操作按照时间顺序并在一起,形成一段序列.显然,会影响查询操作 ...

  2. 一篇自己都看不懂的点分治&点分树学习笔记

    淀粉质点分治可真是个好东西 Part A.点分治 众所周知,树上分治算法有$3$种:点分治.边分治.链分治(最后一个似乎就是树链剖分),它们名字的不同是由于分治方式的不同的.点分治,顾名思义,每一次选 ...

  3. 对于挑战书上的很久之前都看不懂的DP看懂的突破

    突破一..牢记问题概念 并且牢记dp状态方程 突破二..一直有一个求和dp转化成O1dp递推的式子看不懂.. 看不懂的原因是..没有分清求和符号作用的范围 提醒:以后遇到求和符号一定明确其求和的式子的 ...

  4. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

  5. async,await执行流看不懂?看完这篇以后再也不会了

    昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就 ...

  6. 还看不懂同事的代码?Lambda 表达式、函数接口了解一下

    当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...

  7. 还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

    Java 8 新特性系列文章索引. Jdk14都要出了,还不能使用 Optional优雅的处理空指针? Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下? 还看不懂同事的代码?Lambda ...

  8. 小白学习React官方文档看不懂怎么办?3.元素渲染

    直接上代码 const element = <h1>Hello, world</h1>; ReactDOM.render(     element,      document ...

  9. B树?这篇文章彻底看懂了!

    前言 索引,相信大多数人已经相当熟悉了,很多人都知道 MySQL 的索引主要以 B+ 树为主,但是要问到为什么用 B+ 树,恐怕很少有人能把前因后果讲述完整.本文就来从头到尾介绍下数据库的索引. 索引 ...

随机推荐

  1. Linux 学习笔记之超详细基础linux命令 Part 8

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 7----------------- ...

  2. 手把手教你撸一个简易的 webpack

    背景 随着前端复杂度的不断提升,诞生出很多打包工具,比如最先的grunt,gulp.到后来的webpack和Parcel.但是目前很多脚手架工具,比如vue-cli已经帮我们集成了一些构建工具的使用. ...

  3. CSS| 框模型-border

    CSS 边框属性

  4. 转,ffmpeg参数中文详细解释

    a) 通用选项 -L license-h 帮助-fromats 显示可用的格式,编解码的,协议的...-f fmt 强迫采用格式fmt-I filename 输入文件-y 覆盖输出文件-t durat ...

  5. Memory barrier 简介

    Memory barrier Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问.内存乱序访问行为出现的理由是为了提升程序运行时的 ...

  6. JavaScript高级特性-数组

    1. JavaScript中的数组 在C++.Java中,数组是一种高效的数据结构,随机访问性能特别好,但是局限性也特别明显,就是数组中存放的数据必须是同一类型的,而在JavaScript中,数组中的 ...

  7. CMD(命令提示符)命令大全及网络安全课程中所用到的命令

    CMD命令大全详解: 1.arp -a 获得IP地址,MAC地址. 2.arp -d * 命令用于清空arp缓存表. 3.arp –s 网关IP 网关MAC 命令则是将网关IP地址与其相应的MAC地址 ...

  8. 初探InnoDB MVCC源码实现

    1. 背景 本文基于MySQL InnoDB源码对InnoDB中非锁定一致性读是如何实现的作一些简单的探究. 2. 基本概念 2.1 隐藏字段 在经典之作<高性能MySQL>的1.4节中提 ...

  9. WPF防止重复运行实例

    1.方法一 在app.xaml.cs下添加如下代码: /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partia ...

  10. leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)

    124. Binary Tree Maximum Path Sum https://www.cnblogs.com/grandyang/p/4280120.html 如果你要计算加上当前节点的最大pa ...