其他分享
首页 > 其他分享> > 行列式&矩阵树定理学习笔记

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

作者:互联网

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 性质

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)_{i, j} = \begin{cases} \deg_i & (i = j) \\ 0 & (i \ne j) \end{cases} \]

\[D^{in}(G)_{i, j} = \begin{cases} \mathrm{in}_i & (i = j) \\ 0 & (i \ne j) \end{cases}, D^{out}(G) _ {(i, j)} = \begin{cases} \mathrm{out}_i & (i = j) \\ 0 & (i \ne j) \end{cases} \]

2.2 定理

\[\forall i\in[1,n],T(G)=\det(K_i(G)) \]

\[\forall i\in[1,n],T^{out}(G,i)=\det(K^{in}_{i}(G)) \]

\[\forall i\in[1,n],T^{in}(G,i)=\det(K^{out}_{i}(G)) \]

​ 即外向树对应入度矩阵,内向树对应出度矩阵

\[E(G)=T^{out}(G,u)\prod_{i=1}^{n}(\deg_i-1)!(u\in[1,n]) \]

\[E(G,u)=T^{out}(G,u)\deg_u\prod_{i=1}^{n}(\deg_i-1)!(u\in[1,n]) \]

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