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. 用animate改变了某个样式之后再用css控制会无效

    我前几天写了个移动端运动,(这个运动的代码我贴在这了:http://www.cnblogs.com/weiman/p/6600380.html)然后发现了这个问题,具体如下: 未运动前是这样的,菜单栏 ...

  2. Application.Current的使用

    来源 http://www.cnblogs.com/symons/archive/2010/03/15/1686200.html Application.Current的使用 WPF程序对应一个App ...

  3. Session Cookies随笔

    1.对于Session而言 它是用来保存在服务端的信息,可以用来做登录验证,在后台保存有用信息. 一个浏览器访问一个网站,就是建立一个连接,连接信息是独立的,就是在该建立的连接内,保存到Session ...

  4. (小技巧)Sql server查看sql语句的执行时间(转)

    转自CSDN: 在写数据库sql的时候,我们往往很关心该sql语句的执行效率,如下小技巧可以帮助程序员简单快速的得到某条或某几条sql的执行时间. declare @d datetime set @d ...

  5. 使用VSTS的Git进行版本控制(六)——拉取请求

    使用VSTS的Git进行版本控制(六)--拉取请求 在将代码合并到主干之前,拉取请求让团队对特性分支的更改提供反馈.审阅人可以通过建议修改留下评论,并投票批准或拒绝代码. 任务1:在Visual St ...

  6. OneAPM大讲堂 | 基于图像质量分析的摄像头监控系统的实现

    今天咱们要介绍的技术很简单,请看场景: 你在家里安装了几个摄像头想监视你家喵星人的一举一动,然而,就在喵星人准备对你的新包发动攻击的时候,图像突然模糊了.毕竟图像模糊了以后你就没法截图回家和喵当面对质 ...

  7. LeetCode题解之Binary Tree Pruning

    1.题目描述 2.问题分析 使用递归 3.代码 TreeNode* pruneTree(TreeNode* root) { if (root == NULL) return NULL; prun(ro ...

  8. Python类继承,方法重写及私有方法

    # -*- coding: utf-8 -*- """ Created on Mon Nov 12 15:05:20 2018 @author: zhen "& ...

  9. Luncene介绍

    1.Luncene介绍 案例:实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字文件都需要找出来.还可以根据中文词语进行查询,并且需要支持多个条件查询.Lucene可以解决 数 ...

  10. 转:Vue2.0+组件库总结

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...