矩阵树定理大意与题表

感觉最近比较喜欢写成一个题表的形式。。感觉很舒服

定理大意

给定了一个图,我们先求出它的度数矩阵D和邻接矩阵A:
度数矩阵:D[x][x]表示点xx的度数,其它元素为0.
邻接矩阵:A[i][j]代表i到j是否有边。有边则为1,否则为0.
由此计算出基尔霍夫矩阵C:C=D−A
对于一个基尔霍夫矩阵,随意去掉第r行和第r列(r∈[1,n]r∈[1,n]),留下的这个矩阵的行列式的值,就是生成树的个数。

不知道什么是行列式是什么的,自己去学了,我就不做解释了

题表

bzoj4031
一个很裸的行列式,非常简单
值得一提的是,这个不可以用普通的高斯消元来解,因为他需要支持%。于是就需要用到另外一种类似于辗转相除的方法来求解,具体看代码吧。。这里我不写了
但是有一个地方我调了很久。。
一开始,我没有记录当前的行列式被取反了多少次
然后对于数据

2 4
*…
….

我算出来在膜意义下-999999985
我以为他是正数,于是我就直接输出来了
其实在膜的意义下,他是要转正的,然而我并没有这一步
于是就GG了。。
所以要注意的是,你必须要把他转正,也就是你要知道他的符号是什么,也就是要记录一个反转了多少次
由于是第一个入门题,所以代码将在这里给出

bzoj1016
这题的话,估计有很多人都是些搜索的吧。。我以前也是。。
当然,这题其实是可以不用搜索的。。
因为我们知道,边权为i的,给图造成的连通性的变化是固定的
于是我们就可以对于每一个边权为i的,做一次矩阵树定理计算方案。。
然后就可以了

bzoj4766
这题的话,不难看出一个原始的矩阵的余子式。。
下面给出一个 n=3,m=2 的栗子

n0110n1111m0110m

但是矩阵的规模很大。。肯定是不可以直接做的
于是我们就要考虑一个人工消元的方法
我们把上面前n行,都乘上 1/nm
n0000n0011mn/mn/m11n/mmn/m

于是我们可以吧他看做两个新的行列式相乘。。
n00n mn/mn/mn/mmn/m
然后用常用技巧,吧下面的n-1行都加到第一行上,就可以得到一行的1了,这个大家动手画一画就知道了。。
得到了一行的1,不就好消了吧。。
然后最后你就可以得到一个公式了
mn1nm1
然后写一个快速乘和快速幂就可以了。。注意各种等于0的情况。。

bzoj3534
做这题,你要知道一个定理:

基尔霍夫矩阵的任意一个代数余子式是所有生成树的边权积的和

然后剩下的就比较简单了。。
但是要注意的是,你不仅要乘上这个边选的概率,还要乘上别的边不选的概率。那么这个怎么处理呢,你可以算出一个tmp,是每条边都不选的概率是多少。然后呢,你就对一个东西的概率改为 a[i]/(1a[i] ,最后做完,再乘上tmp,就可以了。至于为什么这样,很简单的。。自己化下式子就可以了

bzoj4596
感觉最近做题太少,思维都退化了啊。。
这么简单的一道题都没有想出来QAQ
一直没有想到怎么保证每个公司都有一个。。
然后看了题解才知道要用容斥原理。。看来我真的是退步了啊。。
然后你就容斥一下,枚举那些公司要,然后对于这些公司,用矩阵树定理来算出生成树个数就好了。
然后对于要支持%的行列式,我又写挫了。。没有转正。。看了好久才发现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值