矩阵树定理 学习笔记

全是在抄写 czy 的课件,其实也不是很全面和严谨。

矩阵行列式

定义

矩阵 \(A\) 行列式记为 \(\det(A)\)\(|A|\)

\[\det(A)=\sum_{\text{$p$ 为 $1\dots n$ 的全排列}}(-1)^{\text{$p$ 的逆序对数}}\prod_{i}A_{i,p_i} \]

性质

  • \(A\) 中某一行(列)同乘 \(k\),行列式乘 \(k\)
  • \(\det(A)=\det(A^T)\)
  • \(A\) 交换两行(列),行列式乘 \(-1\)
    因为交换两行会使所有排列 \(p\) 逆序对数 \(+1\)\(-1\)
  • \(A\) 中存在两行(列)相等,行列式为 \(0\)
    因为若 \(r_1,r_2\) 两行相等,那么包含 \(A_{r_1,i},A_{r_2,j}\) 的排列和包含 \(A_{r_1,j},A_{r_2,i}\) 的排列一一对应,乘积相等,符号相反。
  • \(A\) 中某一行(列)各元同乘一个数加到另一行(列)对应元上,行列式不变;
    因为行列式是关于某一行(列)的线性函数,在其它行不变的情况下,某一行相加,行列式也就相加;
    可以将 \(A'\) 拆分成 \(A\) 和一个行列式为 \(0\) 的矩阵的和。

约定与定义

  • 无向图(有向图)\(G=(V,E)\)
  • \(n=|V|\)\(m=|E|\)
  • 关联矩阵 \(M(G)[n\times m]\)

\[M_{i,j}=\begin{cases} -1&\text{$v_i$ 是 $e_j$ 的起点}\\ 1&\text{$v_i$ 是 $e_j$ 的终点}\\ 0&\text{otherwise} \end{cases} \]

\(G\) 为无向图时,每条边是随意定向的。

  • \(M\) 的简约关联矩阵 \(M_0[(n-1)\times m]\),是 \(M\) 去掉最后一行得到的。
  • \(M\) 的抽列矩阵 \(M_0(S)[(n-1)\times (n-1)]\),其中 \(S\subseteq E\) 是大小为 \(n-1\) 的边集。
  • 拉普拉斯矩阵 \(L(G)[n\times n]\)

\[L_{i,j}=\begin{cases} -m_{i,j}&i\neq j,~\text{$i,j$ 之间有 $m_{i,j}$ 条边}\\ \mathrm{deg}(v_i)&i=j \end{cases} \]

Lemma I

\[M\times M^T=L \]

\[\begin{aligned} (M\times M^T)_{i,j}&=\sum_k M_{i,k}\times M^T_{k,j}\\ &=\sum_k M_{i,k}\times M_{j,k} \end{aligned} \]

  • \(i\neq j\)\(M_{i,k}\times M_{j,k}=-1\times [e_k\in E]\),所以 \(\text{上式}=-m_{i,j}\)
  • \(i=j\)\(M_{i,k}\times M_{j,k}=(M_{i,k})^2=[e_k\in E]\),所以 \(\text{上式}=\mathrm{deg}(v_i)\)

Lemma II

\(S\subseteq E\)\(|S|=n-1\)\(G'=(V,S)\),则

\[\det(M_0(S))=\pm[\text{$G'$ 构成树}] \]

\(G'\) 不构成树,那么 \(M_0\) 会存在若干列线性相关,行列式为 \(0\)

\(G'\) 构成树:

取树上的点拓扑排序后前 \(n-1\) 个点,记为 \(u_1,u_2\dots u_{n-1}\),以及其对应边 \(c_1,c_2,\dots c_{n-1}\)

交换 \(M_0\) 的行,使得第一行对应 \(u_1\),第二行对应 \(u_2\)……

交换 \(M_0\) 的列,使得第一列对应 \(c_1\),第二列对应 \(c_2\)……

此时 \(M_0\) 变为下三角矩阵,主对角线乘积为 \(\pm 1\),行列式为 \(\pm 1\)

Binet-Cauchy 定理

\(A[n\times m],B[m\times n]\),则

\[\det(A\times B)=\sum_{\substack{S\subseteq \{1,2,\dots m\}\\|S|=n}}\det(A[S])\times\det(B[S]) \]

其中 \(A[S]\) 表示取出列集合为 \(S\) 的子矩阵,\(B[S]\) 表示取出行集合为 \(S\) 的子矩阵。

太顶了,看不懂证明。

特别地,当 \(A,B\) 是同阶方阵时,\(\det(A\times B)=\det(A)\times \det(B)\)

矩阵树定理

\(L_0\)\(L\) 去掉第 \(i\) 行第 \(i\) 列的子矩阵,那么 \(G\) 的生成树个数为 \(\det(L_0)\)

不妨令 \(i=n\),则 \(L_0=M_0\times M_0^T\)

\[\begin{aligned} \det(L_0)&=\det(M_0\times M_0^T)\\ &=\sum_{S}\det(M_0[S])\times\det(M_0^T[S])\\ &=\sum_{S}\det(M_0[S])^2\\ &=\sum_{S}[\text{$(V,S)$ 构成生成树}] \end{aligned}\\ \]


应用

生成树个数计数

\(L=\text{度数矩阵}-\text{邻接矩阵}\)

有向图:

注意 \(L\) 矩阵去掉的一行一列必须是有向生成树的根所在的行和列。

  • 当度数矩阵中 \(\mathrm{deg}(u)\)\(u\) 的入度时,得到的时生成外向树个数;
  • 当度数矩阵中 \(\mathrm{deg}(u)\)\(u\) 的出度时,得到的时生成内向树个数;

求生成树边权积的和

将边数改为这些边的权值和。

求生成树边权和的和

我们目前只能求生成树边权乘积的总和,那么就化和为积。

而多项式的性质就符合,在模 \(x^2\) 意义下,\(1\) 次多项式 \(ax+b\)\(cx+d\) 相乘,得到 \((ad+bc)x+bd\)。当 \(b=d=1\) 时,乘积结果多项式的 \(1\) 次项就是 \(a+c\)

所以我们让两个矩阵的元素都为 \(1\) 次多项式即可。

具体实现时,多项式的加、减和乘很好说,需要注意除法是 \(\dfrac{ax+b}{cx+d}=\dfrac{ad-bc}{d^2}x+\dfrac{b}{d}\)

题目

P4336 [SHOI2016]黑暗前的幻想乡

link

考虑容斥,每次枚举建筑公司的子集然后矩阵树定理求生成树个数,复杂度 \(\mathcal O(2^nn^3)\)

code

P3317 [SDOI2014]重建

link

我们要求

\[\sum_{T\subseteq G}\left(\prod_{e\in T}p_e\times\prod_{e\not\in T}(1-p_e)\right) \]

转化一下就是

\[\prod_{e}(1-p_e)\times\sum_{T\subseteq G}\prod_{e\in T}\frac{p_e}{1-p_e} \]

于是可以矩阵树定理了。

注意 \(p_e=1\) 的情况,可以改成 \(1-\varepsilon\),就不会出现 \(-\mathrm{NaN}\) 了。

code

Topcoder#13369. TreeDistance

link

矩阵每个元素放一个 \(1\) 次多项式,\(x\) 代表树边,\(1\) 代表非树边。最后矩阵行列式是一个 \(n−1\) 次多项式,第 \(k\) 次项的系数就代表 \(k\) 条树边的方案数。

\(x\) 代入 \(n\) 个值进去高斯消元得到 \(n\) 个点值,再拉格朗日插值得到多项式系数。

code

P5296 [北京省选集训2019]生成树计数

link

对于已有的边权和为 \(W\),新加入边权 \(w\),答案为

\[(W+w)^k=\sum_{i=0}^k{k\choose i}W^iw^{k-i} \]

写成 EGF 就是 \(e^{Wx}\cdot e^{wx}\) 的第 \(k\) 项系数。

那么对于每一条边的边权设为 \(e^{wx}\),做矩阵树定理,带着多项式高斯消元(任何时刻只保留前 \(k\) 次项),复杂度 \(\mathcal O(n^3k^2)\)

因为多项式次数不是有限的,只是 \(\bmod x^{k+1}\),所以不能够拉格朗日插值。

code

posted @ 2021-07-17 21:49  RenaMoe  阅读(267)  评论(0)    收藏  举报