行列式&矩阵树定理学习笔记

1.0 行列式

1.1 定义

对一个 n×n 的矩阵 An 阶方阵),其 n 阶行列式写作 det(A) 或者 |A|,定义为:

det(A)=|A|=p(1)τ(p)i=1nai,pi

其中p 表示一个排列,所有可能的 p 则是 1nn 个数的全排列。τ(p) 表示排列 p 的逆序对个数。

1.2 性质

  • 交换任意两行(列)结果变为相反数
  • 一行加上另一行乘常数结果不变
  • 一行同乘 k ,结果也乘 k

1.3 求法

这三条性质直接提示我们使用高斯消元求解,复杂度O(n3)。否则若直接根据定义求解的话,复杂度会达到O(n!×n),难以接受。

特别注意,有时求解行列式时模数不是质数,没法求逆元,这时只能利用辗转消除法进行高斯消元,但复杂度经分析还是O(n3+n2logp)的。贴个模板题代码:

void Gauss()
{
	int o = 1;
	rep(i, 1, n) rep(j, i + 1, n)
	{
		while (a[i][i])
		{
			int cnt = a[j][i] / a[i][i];
			rep(k, i, n) a[j][k] = (a[j][k] - 1ll * a[i][k] * cnt % mod + mod) % mod;
			swap(a[i], a[j]); o = -o;
		}
		swap(a[i], a[j]); o = -o;
	}
	rep(i, 1, n) res = 1ll * res * a[i][i] % mod;
	if (o == -1) res = (mod - res) % mod; return;
}

2.0 矩阵树定理

2.1 定义

  • 对于无向图,定义 D(G) 为图 G 的度数矩阵,其中:

D(G)i,j={degi(i=j)0(ij)

  • 对于有向图,定义 Din(G) 为图 G 的入度矩阵,Dout(G) 为图 G 的出度矩阵,其中:

Din(G)i,j={ini(i=j)0(ij),Dout(G)(i,j)={outi(i=j)0(ij)

  • 定义 A(G) 为图 G 的邻接矩阵(无重边),其中:

    A(G)i,j=the number of edges from i to j(0/1)

  • 定义图 G 的基尔霍夫矩阵 K(G)=D(G)A(G)Ki(G)表示K去掉第i行与第i列的结果,其中i[1,n](即n1阶主子式)。

  • 定义无向图 G 的生成树数量为 T(G),有向图外向生成树(根为 u,下同)数量为 Tout(G,u),有向图内向生成树数量为 Tin(G,u),有向图的欧拉回路数量为E(G),从u出发的欧拉回路数量为E(G,u)

2.2 定理

  • 无向图矩阵树定理:

i[1,n],T(G)=det(Ki(G))

  • 有向图矩阵树定理(即外向树对应入度矩阵,内向树对应出度矩阵):

i[1,n],Tout(G,i)=det(Kiin(G))

i[1,n],Tin(G,i)=det(Kiout(G))

  • BEST定理(求有向图欧拉回路的个数):

    首先判断是不是所有点的入度等于出度。此处degi为入度矩阵(出度矩阵等价)。有

E(G)=Tout(G,u)i=1n(degi1)!(u[1,n])

E(G,u)=Tout(G,u)degui=1n(degi1)!(u[1,n])

2.3 扩展

以上均只适用于边无权的情况,此时求的是个数。

若扩展到带权值的情况,即求G 所有生成树边权之积的和,这时重新定义

D(G)i,j={(i,x)Gw(i,x)(i=j)0(ij)

A(G)i,j=w(i,j)

剩余部分就都和不带权的情况相同了。类似的,求生成树数量时不再要求无重边,因为此时重边即对应这条边的边权。

2.4 例题

I.省选联考 2020 A 卷 作业题

首先反演一下:

T(i=1n1wei)×gcd(we1,,wen1)=T(i=1n1wei)×dwe1,,dwen1φ(d)=d=1Vφ(d)Tdwe1,,dwen1(i=1n1wei)

前面一部分直接枚举,后面一部分即为求所有生成树的边权和。但注意到矩阵树定理求的是所有生成树边权之积的和,似乎没法做了。

一种直观的想法是求出每条边分别被贡献了多少次。具体的,我们对每条边求出包含这条边的生成树个数,而这个可以用总数减去不包含这条边的生成树个数得到。但这样是O(m×n3)的,考虑优化。

注意到,如果我们把每条边的边权表示成wx+1的形式,那么最终的一次项系数即为我们所求。解释:我们矩阵树定理时求的是每条边边权之积的和,而(w1x+1)(w2x+1)=w1w2x2+(w1+w2)x+1,一次项系数恰好对应我们所求。

所以我们只用维护一次项和常数项即可(可以用一个pair表示)。然后此处会涉及到多项式有关操作,在这里只提一下除法怎么求:

我们想要求出ax+bcx+d,只需要求出cx+d在模x2意义下的逆元即可。设(cx+d)(px+q)1(modx2),可以解得p=cd2,q=1d。则ax+bcx+d=(ax+b)(px+q)=adbcd2x+bd

复杂度为O(n3σ(V))=O(144n3)

II.北京省选集训2019 生成树计数

这题跟上一题有一点像。。

注意到(x+y)k=i=0k(ki)xiyki那么我们给每条边(边权为z)维护一个多项式1+zx+z2x2+...+zkxk,这样两条边的多项式卷起来后,xk的系数恰为所求。或者也可以直接写成EGF的形式。

多项式的有关操作直接O(k2)弄即可。复杂度O(n3k2)

III.USACO21OPEN Routing Schemes P

我们新建一个点S,并从S连向每个发送者,每个接收者连向S,则题目所求即为欧拉回路数目,用BEST定理求即可。

注意孤点不能考虑,否则行列式一乘答案一定是0。还要特别注意此处我们不需要只求2n的行列式,因为直接把S去掉就可以直接考虑1n的了。

posted @   andysj  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示