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

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

  • 对于有向图,定义 \(D ^ {in}(G)\) 为图 \(G\) 的入度矩阵,\(D ^ {out}(G)\) 为图 \(G\) 的出度矩阵,其中:

\[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} \]

  • 定义 \(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 定理

  • 无向图矩阵树定理:

\[\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)) \]

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

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

\[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\)的了。

posted @ 2022-01-28 17:20  andysj  阅读(163)  评论(0编辑  收藏  举报