1.0 行列式
1.1 定义
对一个 n×n 的矩阵 A(n 阶方阵),其 n 阶行列式写作 det(A) 或者 |A|,定义为:
det(A)=|A|=∑p(−1)τ(p)n∏i=1ai,pi
其中p 表示一个排列,所有可能的 p 则是 1 到 n 这 n 个数的全排列。τ(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(i≠j)
- 对于有向图,定义 Din(G) 为图 G 的入度矩阵,Dout(G) 为图 G 的出度矩阵,其中:
Din(G)i,j={ini(i=j)0(i≠j),Dout(G)(i,j)={outi(i=j)0(i≠j)
-
定义 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](即n−1阶主子式)。
-
定义无向图 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(Kini(G))
∀i∈[1,n],Tin(G,i)=det(Kouti(G))
E(G)=Tout(G,u)n∏i=1(degi−1)!(u∈[1,n])
E(G,u)=Tout(G,u)degun∏i=1(degi−1)!(u∈[1,n])
2.3 扩展
以上均只适用于边无权的情况,此时求的是个数。
若扩展到带权值的情况,即求G 所有生成树边权之积的和,这时重新定义
D(G)i,j=⎧⎨⎩∑(i,x)∈Gw(i,x)(i=j)0(i≠j)
A(G)i,j=w(i,j)
剩余部分就都和不带权的情况相同了。类似的,求生成树数量时不再要求无重边,因为此时重边即对应这条边的边权。
2.4 例题
I.省选联考 2020 A 卷 作业题
首先反演一下:
∑T(n−1∑i=1wei)×gcd(we1,⋯,wen−1)=∑T(n−1∑i=1wei)×∑d∣we1,⋯,d∣wen−1φ(d)=V∑d=1φ(d)∑Td∣we1,⋯,d∣wen−1(n−1∑i=1wei)
前面一部分直接枚举,后面一部分即为求所有生成树的边权和。但注意到矩阵树定理求的是所有生成树边权之积的和,似乎没法做了。
一种直观的想法是求出每条边分别被贡献了多少次。具体的,我们对每条边求出包含这条边的生成树个数,而这个可以用总数减去不包含这条边的生成树个数得到。但这样是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)=ad−bcd2x+bd。
复杂度为O(n3σ(V))=O(144n3)。
II.北京省选集训2019 生成树计数
这题跟上一题有一点像。。
注意到(x+y)k=k∑i=0(ki)xiyk−i。那么我们给每条边(边权为z)维护一个多项式1+zx+z2x2+...+zkxk,这样两条边的多项式卷起来后,xk的系数恰为所求。或者也可以直接写成EGF的形式。
多项式的有关操作直接O(k2)弄即可。复杂度O(n3k2)。
III.USACO21OPEN Routing Schemes P
我们新建一个点S,并从S连向每个发送者,每个接收者连向S,则题目所求即为欧拉回路数目,用BEST定理求即可。
注意孤点不能考虑,否则行列式一乘答案一定是0。还要特别注意此处我们不需要只求2∼n的行列式,因为直接把S去掉就可以直接考虑1∼n的了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】