行列式&矩阵树定理学习笔记
作者:互联网
1.0 行列式
1.1 定义
对一个 \(n\times n\) 的矩阵 \(A\)(\(n\) 阶方阵),其 \(n\) 阶行列式写作 \(\det(A)\) 或者 \(|A|\),定义为:
\[\det(A)=|A|=\sum_p(-1)^{\tau(p)}\prod_{i=1}^n a_{i,p_i} \]其中\(p\) 表示一个排列,所有可能的 \(p\) 则是 \(1\) 到 \(n\) 这 \(n\) 个数的全排列。\(\tau(p)\) 表示排列 \(p\) 的逆序对个数。
1.2 性质
- 交换任意两行(列)结果变为相反数
- 一行加上另一行乘常数结果不变
- 一行同乘 \(k\) ,结果也乘 \(k\)
1.3 求法
这三条性质直接提示我们使用高斯消元求解,复杂度\(\mathcal{O}(n^3)\)。否则若直接根据定义求解的话,复杂度会达到\(\mathcal{O}(n!\times n)\),难以接受。
特别注意,有时求解行列式时模数不是质数,没法求逆元,这时只能利用辗转消除法进行高斯消元,但复杂度经分析还是\(\mathcal{O}(n^3+n^2\log p)\)的。贴个模板题代码:
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 ^ {in}(G)\) 为图 \(G\) 的入度矩阵,\(D ^ {out}(G)\) 为图 \(G\) 的出度矩阵,其中:
-
定义 \(A(G)\) 为图 \(G\) 的邻接矩阵(无重边),其中:
\[A(G)_{i, j} = \text{the number of edges from i to j}(0/1) \] -
定义图 \(G\) 的基尔霍夫矩阵 \(K(G) = D(G) - A(G)\),\(K_i(G)\)表示\(K\)去掉第\(i\)行与第\(i\)列的结果,其中\(i\in[1,n]\)(即\(n−1\)阶主子式)。
-
定义无向图 \(G\) 的生成树数量为 \(T(G)\),有向图外向生成树(根为 \(u\),下同)数量为 \(T ^ {out}(G, u)\),有向图内向生成树数量为 \(T ^ {in}(G, u)\),有向图的欧拉回路数量为\(E(G)\),从\(u\)出发的欧拉回路数量为\(E(G,u)\)。
2.2 定理
- 无向图矩阵树定理:
- 有向图矩阵树定理:
即外向树对应入度矩阵,内向树对应出度矩阵
-
\(\rm BEST\)定理(求有向图欧拉回路的个数):
首先判断是不是所有点的入度等于出度。此处\(\deg_i\)为入度矩阵(出度矩阵等价)。有
2.3 扩展
以上均只适用于边无权的情况,此时求的是个数。
若扩展到带权值的情况,即求\(G\) 所有生成树边权之积的和,这时重新定义
\[D(G)_{i, j} = \begin{cases}\sum\limits_{(i,x)\in G}w_{(i,x)} & (i = j) \\0 & (i \ne j)\end{cases} \]\[A(G)_{i,j}=w_{(i,j)} \]剩余部分就都和不带权的情况相同了。类似的,求生成树数量时不再要求无重边,因为此时重边即对应这条边的边权。
2.4 例题
\(\rm I.\)省选联考 2020 A 卷 作业题
首先反演一下:
\[\begin{aligned}&\sum\limits_{T}\left(\sum\limits_{i=1}^{n-1}w_{e_i}\right)\times\gcd(w_{e_1},\cdots,w_{e_{n-1}}) \\=&\sum\limits_{T}\left(\sum\limits_{i=1}^{n-1}w_{e_i}\right)\times\sum\limits_{d\mid w_{e_1},\cdots,d\mid w_{e_{n-1}}}\varphi(d) \\=&\sum\limits_{d=1}^{V}\varphi(d)\sum\limits_{T\atop d\mid w_{e_1},\cdots,d\mid w_{e_{n-1}}}\left(\sum\limits_{i=1}^{n-1}w_{e_i}\right)\end{aligned} \]前面一部分直接枚举,后面一部分即为求所有生成树的边权和。但注意到矩阵树定理求的是所有生成树边权之积的和,似乎没法做了。
一种直观的想法是求出每条边分别被贡献了多少次。具体的,我们对每条边求出包含这条边的生成树个数,而这个可以用总数减去不包含这条边的生成树个数得到。但这样是\(\mathcal{O}(m\times n^3)\)的,考虑优化。
注意到,如果我们把每条边的边权表示成\(wx+1\)的形式,那么最终的一次项系数即为我们所求。解释:我们矩阵树定理时求的是每条边边权之积的和,而\((w_1x+1)(w_2x+1)=w_1w_2x^2+(w_1+w_2)x+1\),一次项系数恰好对应我们所求。
所以我们只用维护一次项和常数项即可(可以用一个\(\rm pair\)表示)。然后此处会涉及到多项式有关操作,在这里只提一下除法怎么求:
我们想要求出\(\dfrac{ax+b}{cx+d}\),只需要求出\(cx+d\)在模\(x^2\)意义下的逆元即可。设\((cx+d)(px+q)\equiv1\pmod {x^2}\),可以解得\(p=-\dfrac{c}{d^2},q=\dfrac{1}{d}\)。则\(\dfrac{ax+b}{cx+d}=(ax+b)(px+q)=\dfrac{ad-bc}{d^2}x+\dfrac{b}{d}\)。
复杂度为\(\mathcal{O}(n^3\sigma(V))=\mathcal{O}(144n^3)\)。
\(\rm II.\)北京省选集训2019 生成树计数
这题跟上一题有一点像。。
注意到\(。(x+y)^k=\sum\limits_{i=0}^{k}\dbinom{k}{i}x^iy^{k-i}。\)那么我们给每条边(边权为\(z\))维护一个多项式\(1+zx+z^2x^2+...+z^kx^k\),这样两条边的多项式卷起来后,\(x^k\)的系数恰为所求。或者也可以直接写成\(\rm EGF\)的形式。
多项式的有关操作直接\(\mathcal{O}(k^2)\)弄即可。复杂度\(\mathcal{O}(n^3k^2)\)。
\(\rm III.\)USACO21OPEN Routing Schemes P
我们新建一个点\(S\),并从\(S\)连向每个发送者,每个接收者连向\(S\),则题目所求即为欧拉回路数目,用\(\rm BEST\)定理求即可。
注意孤点不能考虑,否则行列式一乘答案一定是\(0\)。还要特别注意此处我们不需要只求\(2\sim n\)的行列式,因为直接把\(S\)去掉就可以直接考虑\(1\sim n\)的了。
标签:limits,sum,矩阵,笔记,行列式,mathcal,cases,out 来源: https://www.cnblogs.com/andysj/p/15853296.html