Live2D

矩阵树定理 学习笔记

Matrix Tree定理

写在前面的话#

写这篇博客其实写了很久,主要是刚开始的时候太菜了,完全不能完全理解,于是,我写的东西当我变得强一点之后就会发现有点问题,于是就改啊改啊添啊添啊,于是就从刚才开始的那个样子变成了现在这样。

希望我写的博客能对初学矩阵树定理的同学有一点帮助。

前置知识:行列式#

行列式的定义#

一个矩阵的行列式定义为:

p(1)π(p)j=1Aj,pj

这里的p指的是{1,2,3,...,n}的一种排列,π(p)指的是p的逆序对个数

行列式的求法#

如果我们直接用暴力的话时间复杂度为Θ(n×n!),但是实际上我们可以对此进行优化。


性质1#

交换矩阵的任意两行,行列式变号

我们可以发现交换了两行以后,变化的只有符号位,但是如何说明一定为变成相反数呢?我们发现这个问题只与排列的逆序对数有关,下面引出一个命题来证明。

定理1#

一个排列交换其中任意两个元素,逆序对个数变化量为奇数

证明1#

显然。我们可以发现变化量只跟两个元素之间的元素有关,然后就很好证了,这里就不赘述了。

性质2#

矩阵的一行都乘以k,行列式也乘以k

证明2#

根据定义公式,显然。

性质3#

如果矩阵内有两行相等,那么行列式为0

证明3#

因为交换以后要变为相反数,但是可以看出变化前与变化后行列式一样,所以为了满足条件,行列式的值为0

性质4#

如果一行是另一行的k倍,那么行列式值为0

证明4#

由性质2和性质3显然。

性质5#

一行加上另一行的k倍,行列式不变。

证明5#

可以从行列式定义的式子下手。

我们可以把现矩阵的行列式拆成两个行列式相加,一个是原先矩阵的行列式,另一个是增长的行列式。

根据性质4,可以得到增长的行列式为0

性质6#

一个上三角矩阵的行列式为斜边元素之积。

证明6#

根据公式显然。


有了上面的6个性质,我们就可以用Gauss消元把原矩阵消成一个上三角矩阵,然后就好求了。

模数非质数时的求法#

如果模数非质数我们就不能直接用费马小定理或者拓展欧几里得了。

我们可以考虑用类似于辗转相除法的一种做法,我们一直去找其它行来尽可能抵消当前这一行,然后每一次操作就把两行进行一次尽可能的抵消,实际上就是辗转相除法。结局肯定与辗转相除法一样有一行该列终于变成了零。我们发现这个的时间复杂度也是Θ(n3logn)的。

不过还是有Θ(n3),不过因为我太弱了,这里先咕着。

前置定义:Kirchhoff矩阵#

Kirchhoff矩阵是指的对于一个图构造出来的一个矩阵。具体定义为度数矩阵减去邻接矩阵。

度数矩阵指的是:

Ai,j={degreei,i=j0,ij

邻接矩阵应该就不用解释了。不过需要注意的是如果有重边的话应该算有多少条。

Matrix Tree定理#

一个图中的生成树个数等于其Kirchhoff矩阵的任意一个 代数余子式的行列式

Matrix Tree定理的证明#

性质1#

一个图的Kirchhoff矩阵行列式为零。

性质2#

一个图的Kirchhoff矩阵的任一代数余子式的行列式相同。

前置定义#

我们定义一个图的关联矩阵B为:

ek={uk,vk}

Bk,uk=1,Bk,vk=1

我们定义一个矩阵A的转置矩阵AT为:

Ai,jT=Aj,i

证明#

首先我们可以得到,对于一个图,设它的Kirchhoff矩阵为L,关联矩阵为B,那么有:

L=BBT

这个很好证明,只需要把式子列出来一下就好了。

Part1#

对于一个非连通图G,|L|=0

证明#

|L|L的行列式。我们再设MiL删去第i行第i列后得到的矩阵。

首先,我们考虑把G视作若干个强连通分量,就叫做G1,G2,G3,...,Gk吧。

那么,我们可以考虑对L进行一下交换,把一个联通块内的元素在L排在相邻位置。就比如如果1,2在同一联通块,我们就可以第一行放1,第二行放2

那么:

L=G100...00G20...000G3...0..............................000...Gk

我们这个时候可以不去考虑符号位的变化,因为如果|L|=0也没有区别。

我们可以看出:

|L|=|G1|×|G2|×...×|Gk|

这个我们可以通过想象高斯消元过程来说明。因为最后消掉以后都是上三角矩阵,那么,对于i,Gi都是上三角矩阵,那么就满足条件了。

又因为Kirchhoff矩阵的性质1,所以

i,|Gi|=0

所以|Mi|=|L|=0

Part2#

我们考虑一棵树G

可以通过数学归纳法说明|Mi|=1,这里就不赘述了。

Part3#

这里我们首先要提到一个定理: Binet-Cauthy定理


Binet-Cauthy定理#

|AB|=|s|=n|ApBp|

其中A,B不一定是方阵。s指的是一个从{1,2,3,..,m}中选出的一个集合。Ap表示A的列中只保留s中选中的列留下的矩阵。

由于作者水平有限,这里没有办法证明。(因为我太菜了)


那么,我们就可以进行推导了。我们设BiG的关联矩阵B去掉i这一列的矩阵。可以得到:

|Mi|=|BiBiT|=|s|=n1|BipBiTp|

根据Part2,后面那部分只有在s选出来的边构成树的时候为1,其余时候皆为0

于是原式就等于从G中选出n1条边组成一棵树的方案数。

至此,证毕。

Matrix Tree定理的应用

The 1st#

题目传送门

题目大意#

给定一张无向图,求其生成树个数

Solution#

模板题。用Matrix Tree求解即可。不理解Matrix Tree定理的也可以通过阅读代码理解。

Code#

具体实现

The 2nd#

题目传送门

题目大意#

n个节点,m条边,每条边有pi的概率留下来。求最后留下一棵树的概率。

Solution#

这道题给了我们一个启示,Matrix Tree定理其实是可以推广的。推广到一般情况,Matrix Tree其实求的是所有可能生成树边权之积的和。

这道题是求刚好留下一棵生成树的概率,那么,即是求:

tree(itreepiitree(1pi))

=tree(itreepii(1pi)itree(1pi))

=i=1(1pi)treepi1pi

这个时候我们只需要把 pi1pi 视作第i条边的边权即可。那么一个点的度数就是所有以它为端点的边的边权和。

其实Matrix Tree定理还可以推广到有向图里面去,只需要建图的时候有方向性即可。

Code#

具体实现

The 3rd#

题目传送门

题目大意#

n个节点若干条条边,有n1个公司,每个公司有可以修的边的名单,求每个公司刚好修一条路修出一棵树的方案数。

Solution#

这道题有两个限制,那我们就只好考虑容斥了。

如果我们直接算出n1个公司修铁路的方案数,很显然,我们多算了。因为我们也算上了n2个公司修的方案数,那我们就得减去n2个公司修的方案数,那n2个公司修的方案数又得减去n3个公司修的方案数......以此类推,不难看出这就是个容斥了。

然后套一下矩阵树定理的板子就好了。

Code#

具体实现

The 4th#

题目传送门

题目大意#

给定一棵n个点的数,对于每个k[0,n1],求出恰好有k条边与给定树相同的生成树个数。

思路#

感谢 @EMT__Mashiro 的点拨。

我们上文提到了,其实矩阵树定理求的是:

TeiTwei

wi表示第i条边的权值。

我们对于这道题,我们其实可以发现,如果我们对于在给定树中出现的边赋值为x,未出现过的赋为1,那么,对于k[0,n1],答案就是:

[xk]TeiTwei

但是我们显然不可能直接拿矩阵树定理套多项式吧?(常数爆炸警告!)我们可以发现这其实是一个n1次的多项式,于是我们可以选n个点求到答案然后用高斯消元求到系数即可。

Code#

具体实现

The 5th#

题目传送门

题目大意#

给出一个图,求出:

T(i=1,eiTn1wei)×gcd(we1,we2,we3,..,wen1)

思路#

先讲个特别有趣的事情,这道题其实是2020省选Day2T3,然后恰好那天luogu日报就是这篇博客。。。

我们发现其实这个式子可以反演,就可以变成:

T(i=1,eiTn1wei)×d|we1,d|we2,...,d|wen1φ(d)

=d=1φ(d)T(i=1,iiT,d|weiwei)

于是我们的问题就是如何求出后面那个东西,其实我们有了上一道的基础,我们可以把边权设为1+xwei,那么,答案就是一次项的系数了。于是,我们就可以模拟一个一次多项式Θ(144n4)解决了。(152501144)但是其实Θ(144n4)只是一个上界,实际上远远跑不满,只要剪枝剪得好就可以在500ms左右通过这道题。

一个小小的拓展#

其实矩阵树定理可以拓展到交换环上的元素。交换环就是说上面的元素都满足交换律。

posted @   Dark_Romance  阅读(817)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
CONTENTS