关于行列式在生成树上的应用(行列式、矩阵树定理)

0. 问题引入

给出一张有 \(n\) 的点无向图 \(G\)(可以存在重边、自环),求它的生成树个数。

\(n\le300\),答案对大质数取模。

当遇到需要对一张图的所有生成树中的信息进行统计时,没有十分好的入手角度,需要 Matrix-Tree 树定理进行辅助。

1. 行列式引入

1.1 行列式的定义

对一个 \(n\times n\) 的矩阵 \(A\),其 \(n\) 阶行列式写作 \(\det A\)\(|A|\),定义为

\[\det A=|A|=\sum_{p}(-1)^{\tau(p)}\prod_{i=1}^{n}a_{i,p_i} \]

所有的 \(p\) 形成 \(1\)\(n\) 的全排列,\(\tau(p)\) 表示排列 \(p\) 的逆序对个数。


1.2 排列的奇偶性

  • \(\tau(p)\) 为奇数,则称 \(p\) 是一个奇排列,否则称为一个偶排列。

  • 奇排列与偶排列在 \(n(n\geq2)\) 阶排列中的出现次数相同。

  • 对于排列 \(p\),仅交换其中 \(2\) 个元素,得到一个新的排列,该操作称为对换

  • 一次对换会改变排列的奇偶性。

  • \(p\) 的逆排列 \(p'\) 满足 \(\tau(p')=\tau(p)\)

排列 \(p'\) 满足 \(p'_{p_i}=i\)\(\tau(p')\) 相当于按权值排序后下标的逆序对数。

假设 \(p\) 中下标分别为 \(i,j\) 的两个元素 \(p_i,p_j\),假设 \(i<j\),则 它们在 \(p'\) 中的相对位置为 \((p_j,j)\)\((p_i,i)\)。可以得到 \((p_j,p_i)\)\(p'\) 中的逆序对等价于 \((i,j)\)\(p\) 中的逆序对,故 \(\tau(p)=\tau(p')\)

  • 定义 \(p_q\) 为排列 \(q\) 与排列 \(p\) 的复合,则 \(\tau(p_q)\)\(\tau(p)+\tau(q)\) 的奇偶性相同。

相当对排列 \(q\) 做一次 \(p\) 对应的置换,原来的逆序对为 \(\tau(q)\),产生了 \(\tau(p)\) 次交换,可得上式。


1.3 行列式的性质

\(a_{i,j}\)\(A(i,j)\) 表示 \(n\times n\) 矩阵 \(A\)\(i\) 行第 \(j\) 列的元素。

\(n\) 阶方阵 \(A\) 的转置 \(A^T\) 也是一个 \(n\) 阶方阵,满足 \(A^T(i,j)=A(j,i)\)

  • 矩阵转置后行列式值不变。

等价于证明

\[\sum_{p}(-1)^{\tau(p)}\prod_{i=1}^{n}a_{i,p_i}=\sum_{p}(-1)^{\tau(p)}\prod_{i=1}^{n}a_{p_i,i} \]

强严格地,考虑证明 \((-1)^{\tau(p)}=(-1)^{\tau(p')}\),其中 \(p'\)\(p\) 的逆排列,满足 \(p'_{p_i}=i\)

\(\tau(p')\) 即按权值排序后下标的逆序对数,有 \(\tau(p)=\tau(p')\),得证。

对原矩阵执行列变换,相当于在转置后的矩阵中执行行变换。于是所有对行满足的性质,对于列而言也满足。下面只考虑行的情况。

  • 行列式的行(列)所有元素等比例变化,则行列式等比例变化。

\[\det\begin{bmatrix} a_{1,1}&a_{1,2}&\cdots&a_{1,n} \\ \vdots&\vdots&\ddots&\vdots \\ ka_{i,1}&ka_{i,2}&\cdots&ka_{i,n} \\ \vdots&\vdots&\ddots&\vdots \\ a_{n,1}&a_{n,2}&\cdots&a_{n,3} \end{bmatrix}=k\times \det\begin{bmatrix} a_{1,1}&a_{1,2}&\cdots&a_{1,n} \\ \vdots&\vdots&\ddots&\vdots \\ a_{i,1}&a_{i,2}&\cdots&a_{i,n} \\ \vdots&\vdots&\ddots&\vdots \\ a_{n,1}&a_{n,2}&\cdots&a_{n,3} \end{bmatrix} \]

  • 交换行列式两行(列),行列式值反号。

相当于交换原排列的两位置,\(\tau(p)\) 奇偶性改变,行列式值反号。

  • 若行列式两行(列)成比例,则行列式值为 \(0\)

将该比例提出,则交换两行后行列式取反且不变,故行列式为 \(0\)

  • 将行列式某行(列)的值拆为两部分,行列式求和后与原行列式值相等。

\[\begin{aligned} & \det\begin{bmatrix} a_{1,1}&a_{1,2}&\cdots&a_{1,n} \\ \vdots&\vdots&\ddots&\vdots \\ b_{i,1}+c_{i,1}&b_{i,2}+c_{i,2}&\cdots&b_{i,n}+c_{i,n} \\ \vdots&\vdots&\ddots&\vdots \\ a_{n,1}&a_{n,2}&\cdots&a_{n,n} \end{bmatrix} \\ &= \det\begin{bmatrix} a_{1,1}&a_{1,2}&\cdots&a_{1,n} \\ \vdots&\vdots&\ddots&\vdots \\ b_{i,1}&b_{i,2}&\cdots&b_{i,n} \\ \vdots&\vdots&\ddots&\vdots \\ a_{n,1}&a_{n,2}&\cdots&a_{n,n} \end{bmatrix} + \det\begin{bmatrix} a_{1,1}&a_{1,2}&\cdots&a_{1,n} \\ \vdots&\vdots&\ddots&\vdots \\ c_{i,1}&c_{i,2}&\cdots&c_{i,n} \\ \vdots&\vdots&\ddots&\vdots \\ a_{n,1}&a_{n,2}&\cdots&a_{n,n} \end{bmatrix} \end{aligned} \]

  • 将矩阵的一行(列)的值全部乘一个常数 \(k\) 加到另一行(列)上,行列式值不变。

利用上一条性质将增量拆出来,易得行列式的变量为 \(0\)


1.4 行列式求值

一般要求计算行列式对某个数 \(p\) 取模的值。

1.4.1 模数为质数

上三角方阵 \(A\) 的行列式为 \(\prod_{i=1}^{n}a_{i,i}\)

于是对任意方阵 \(A\),只需使用高斯消元将 \(A\) 行化简为上三角矩阵即可。主要流程与手动行化简基本相同,例如:

\[\begin{bmatrix}1&2&3\\2&2&5\\0&3&2\end{bmatrix}\sim\begin{bmatrix}1&2&3\\0&-2&-1\\0&3&2\end{bmatrix}\sim\begin{bmatrix}1&2&3\\0&-2&-1\\0&0&1/2\end{bmatrix} \]

求得 \(A\) 的行列式为 \(1\times(-2)\times(1/2)=-1\)。由于模数为质数,可以乘上一个数在模 \(p\) 意义下的乘法逆元来代替除法。每次交换两行的时候要对行列式取反。

时间复杂度 \(O(n^3)\)


1.4.2 模数不为质数

此时若 \(a_{i,i}\) 不与 \(p\) 互质,\(\dfrac{a_{j,i}}{a_{i,i}}\) 可能无意义。

考虑辗转相除,每次将第 \(j\) 行消去,将 \(a_{j,i}\) 变为 \(a_{j,i}\bmod a_{i,i}\),然后交换两行(变号),直至 \(a_{j,i}=0\)。在辗转相除的过程中不需要进行除法操作。

\(V\)\(A\) 中元素值域,每行均摊进行 \(O(\log_2 V)\) 次辗转相除,时间复杂度 \(O(n^3+n^2\log_2 V)\)


2. Matrix-Tree 定理

2.1 定义

以下假设图 \(G\)\(|V|=n\)\(|E|=m\)\(e_j\) 表示编号为 \(j\) 的边。

  • 对于无向图,定义图 \(G\) 的度数矩阵 \(D(G)\),其中

\[D(G)(i,j)=\begin{cases} \mathrm{deg}_i&i=j \\ 0& i\not=j \end{cases} \]

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

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

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

  • 定义图 \(G\) 的邻接矩阵 \(A(G)\),其中

\[A(G)(i,j)=从i到j的边数 \]

  • 定义图 \(G\)\(\mathrm{kirchhoff}\) 矩阵 \(K(G)=D(G)-A(G)\)。(亦称 \(\mathrm{Laplace}\) 矩阵)

  • 定义无向图 \(G\) 的生成树数量为 \(t(G)\)

  • 定义有向图 \(G\) 的以 \(r\) 为根的根向树形图个数为 \(t^{root}(G,r)\),叶向树形图个数为 \(t^{leaf}(G,r)\)。前者的边均指向父亲,后者的边均指向儿子。

  • 定义图 \(G\) 的关联矩阵 \(M(G)\) 为一个 \(n\times m\) 矩阵,其中

\[M(G)(i,j)=\begin{cases}-1 & i是e_j的终点 \\ 1 & i是e_j的起点 \\ 0 & \text{Otherwise.}\end{cases} \]

无向图中边的方向可以随意,即若编号为 \(j\) 的边连接 \(u\)\(v\),令 \(M(G)(u,j)\)\(M(G)(v,j)\) 其一为 \(1\),另一个为 \(-1\) 即可。

  • 定义图 \(G\) 的减关联矩阵 \(M_0(G)\) 为关联矩阵 \(M(G)\) 去掉最后一行后的 \((n-1)\times m\) 矩阵。

  • 定义图 \(G\) 的子减关联矩阵 \(M_0(G)[S]\) 为在 \(M_0(G)\) 中选择集合 \(S\) 中的列构成的 \((n-1)\times(n-1)\) 矩阵,满足 \(|S|=n-1\)\(S\subseteq\{1,2,\cdots,m\}\)


2.2 无向图中的 Matrix-Tree 定理

只考虑证明无向图的情况:

\[\forall i\in[1,n],t(G)=\det K_{i,i}(G) \]

\(K_{i,i}(G)\) 表示将 \(K(G)\) 的第 \(i\) 行和第 \(i\) 列删除后的矩阵,也就是说 \(K(G)\) 的所有 \(n-1\) 阶主子式都相等。

Lemma 1

\[M\times M^{T}=K \]

等价于

\[\begin{aligned} M\times M^T(i,j) &= \sum_{k=1}^{m}M(i,k)\times M^T(k,j) \\ &= \sum_{k=1}^{m}M(i,k)\times M(j,k) \end{aligned} \]

乘积的贡献非零当且仅当 \(i,j\) 均为边 \(k\) 的端点。

\(i=j\),则 \(M(i,k)=M(j,k)\),贡献为 \(1\),点 \(i\) 的总贡献为 \(\mathrm{deg}_i\)

\(i\ne j\),则 \(M(i,k)=-M(j,k)\),贡献为 \(-1\),有序点对 \((i,j)\) 的总贡献为 \(-A(i,j)\)

得证。


Lemma 2

\(S\) 构成的边集在原图上构成生成树,那么 \(\det M_0[S]=\pm 1\),否则 \(\det M_0[S]=0\)

先考虑后者:若原图没有构成树,则至少存在一个简单环 \(C(e_{i_1},e_{i_2},\cdots,e_{i,k})\)。假设边有向,用 \(u_j\)\(v_j\) 分别表示 \(e_{i_j}\) 的起点和终点,即 \(v_j=u_{(j\bmod k)+1}\)

只关注 \(M_0[S]\) 里简单环中的点和边,得到一个 \(k\times k\) 矩阵,满足如下性质:

  • 对于同一行,恰有两列非 \(0\)

  • 对于同一列,恰有两行非 \(0\),且一行为 \(1\),一行为 \(-1\)(视作第 \(n\) 行还未删除)。

接着考虑证明 \(M_0\)\(i_1,i_2,\cdots,i_k\) 列线性相关,这等价于 \(\det M_0[S]=0\)

对于 \(j=1,2,\cdots,k-1\),将第 \(i_j\) 列合并至 \(i_{j+1}\) 列:

\(j\ne k-1\),由于简单环上两边共点,恰有一行使得两列上的元素均非零,将这行消去后会得到 \(u_1\)\(v_j\) 两行,且一行为 \(1\),一行为 \(-1\)

\(j=k-1\) 时,非零两行与 \(i_k\) 列相同,可以相消,则 \(i_1,i_2,\cdots,i_k\) 列线性相关,\(\det M_0[S]=0\)

对于前者也使用列变换对矩阵进行消元:若 \(S\) 构成的边集为一棵树,令 \(n\) 为它的根。

同样只关注 \(M_0[S]\) 对应矩阵,一个叶子结点 \(u\) 所在行只有一个非零元素,使用该列进行消元,会消掉 \(u\) 的父边对应列上的一个 \(1/-1\)

这等价于每次在 \(M_0[S]\) 中删去树上叶子节点对应的一条边。

于是每次挑选一个叶子节点进行消元,可以将树上所有边删除。最后每一行剩下恰好一列,为该节点作叶子时对应元素(一定是 \(1/-1\))。

由行列式的定义,\(\det M_0[S]=\pm1\)


Lemma 3(Binet-Cauthy 定理)

\(A,B\) 分别是 \(n\times m\)\(m\times n\) 矩阵(\(n\le m\)),则

\[\det AB=\sum_{S\subseteq{1,2,\cdots,m},|S|=n}\det A[S]\times\det B[S] \]

其中 \(A[S],B[S]\) 分别表示 \(A\) 取集合 \(S\) 中的列,\(B\) 取集合 \(S\) 中的行构成的矩阵。

展开等式右侧:

\[\begin{aligned} & \sum_{S\subseteq{1,2,\cdots,m},|S|=n}\det A[S]\times \det B[S]\\ &= \sum_S\Bigg(\sum_p(-1)^{\tau(p)}\prod_{i=1}^{n}a_{i,S_{p_i}}\Bigg)\times\Bigg(\sum_q(-1)^{\tau(q)}\prod_{i=1}^{n}b_{S_i,q_i}\Bigg)\\ &= \sum_S\sum_p\sum_q(-1)^{\tau(p)+\tau(q)}\prod_{i=1}^{n}a_{i,S_{p_i}}\times b_{S_i,q_i} \end{aligned} \]

展开等式左侧:

\[\begin{aligned} & \det AB\\ &= \sum_{p}(-1)^{\tau(p)}\prod_{i=1}^{n}\Bigg(\sum_{j=1}^{m}a_{i,j}\times b_{j,p_i}\Bigg)\\ &= \sum_{p}(-1)^{\tau(p)}\sum_{r}\Bigg(\prod_{i=1}^{n}a_{i,r_i}\times b_{r_i,p_i}\Bigg)\\ &= \sum_r\sum_p(-1)^{\tau(p)}\Bigg(\prod_{i=1}^{n}a_{i,R_i}\Bigg)\times\Bigg(\prod_{i=1}^{n}b_{r_i,p_i}\Bigg) \end{aligned} \]

其中 \(r\) 是一个长为 \(n\) 的序列,其中元素在 \(\{1,2,\cdots,m\}\) 内。

\(r\) 中有重复元素,则存在 \(i,j\) 使得 \(i<j,r_i=r_j\),交换 \(p_i,p_j\),后面积式不变且逆序对奇偶性改变,则两者贡献互为相反数,可以抵消,此时序列 \(r\) 的贡献为 \(0\)

故只需枚举不重序列,先枚举 \(\{1,2,\cdots,m\}\) 的子集,然后枚举一个长为 \(n\) 的排列:

\[\begin{aligned} & \det AB\\ &= \sum_S\sum_q\sum_p(-1)^{\tau(p)}\Bigg(\prod_{i=1}^{n}A(i,S_{q_i})\Bigg)\times\Bigg(\prod_{i=1}^{n}B(S_{q_i},p_i)\Bigg)\\ &= \sum_S\sum_q\sum_{p_{q'}}(-1)^{\tau(p_{q'})}\Bigg(\prod_{i=1}^{n}A(i,S_{q_i})\Bigg)\times\Bigg(\prod_{i=1}^{n}B(S_i,p_{q'_i})\Bigg)\\ &= \sum_S\sum_q\sum_{p_{q'}}(-1)^{\tau(p)+\tau(q)}\Bigg(\prod_{i=1}^{n}A(i,S_{q_i})\Bigg)\times\Bigg(\prod_{i=1}^{n}B(S_i,p_{q'_i})\Bigg) \end{aligned} \]

整理后与右式相等。


最后只需证明矩阵树定理删去第 \(n\) 行和第 \(n\) 列是正确的。对于其余的情况,可以将 \(M_0\) 的定义改为删去该行。

与引理 \(1\) 类似地有

\[K_0=M_0\times M_0^T \]

其中 \(K_0\)\(K\) 删除最后一行和最后一列的矩阵。

由引理 \(3\)

\[\begin{aligned} \det K_0 &= \sum_S\det M_0[S]\times\det M_0^T[S]\\ &= \sum_S\det^2 M_0[S] \end{aligned} \]

若边集 \(S\) 不构成生成树,贡献为 \(0\);否则由 \(\det M_0[S]=\pm1\),贡献为 \(1\)

可得 \(\det K_0\) 即原图的生成树数量。


2.3 有向图中的矩阵树定理

\[\forall i\in[1,n],t^{root}(G,i)=\det K_{i,i}^{out}(G) \]

\[\forall i\in[1,n],t^{leaf}(G,i)=\det K_{i,i}^{in}(G) \]


3. 在问题中的简单应用

3.1 生成树计数

回到最开始的问题:求一张 \(n\) 个点的无向图 \(G\) 的生成树个数,\(n\le 300\)

由矩阵树定理,只需对原图处理出它的 \(\mathrm{kirchhoff}\) 矩阵 \(K(G)=D(G)-A(G)\),删去最后一行和最后一列得到 \(K_0(G)\)(删去任何相同编号的一行和一列均可),使用高斯消元进行行列式求值即可。

时间复杂度 \(O(n^3)\)


3.2 生成树权值和

求一张 \(n\) 个点的无向带权图的生成树权值和,权值定义为生成树每条边边权之和。

\(u,v\) 间的边权为 \(w\),令它们的新边权为一次多项式 \(wx+1\),则若干边作乘积后的一次项即为边权和,套用 Matrix-Tree 定理并在 \(\operatorname{mod} x^2\) 意义下求行列式即可。

时间复杂度 \(O(n^3)\)


3.3 与概率的结合

来源:[SDOI2014] 重建

一张 \(n\) 个点的无向图,两点 \(i,j(i<j)\) 间存在边的概率是 \(p_{i,j}\),无自环。

问恰有 \(n-1\) 条边且这些边构成图的生成树的概率,精度要求 \(10^{-3}\)

\(n\le 50\)

所求为

\[\begin{aligned} & \sum_T\Big(\prod_{e\in T}p_e\prod_{e\not\in T}(1-p_e)\Big)\\ &= \sum_T\Bigg(\prod_{e\in T}p_e\cdot\frac{\prod_{e}(1-p_e)}{\prod_{e\in T}(1-p_e)}\Bigg)\\ &= \prod_{e}(1-p_e)\cdot\Bigg(\sum_T\prod_{e\in T}\frac{p_e}{1-p_e}\Bigg) \end{aligned} \]

\(e\) 的边权赋为 \(w_e=\dfrac{p_e}{1-p_e}\),只需求所有生成树的权值和,其中权值定义为边权 \(w\) 之积。

事实上,若 \((i,j)\) 间的边权为 \(w\),将其视作两点间有 \(w\) 条重边,问题即可转化为 3.1 中的生成树计数。

由于边权为小数,用浮点数和高斯消元处理 \(K(G)\) 的行列式,当 \(p_e\)\(0\)\(1\) 时需要进行特殊处理。

时间复杂度 \(O(n^3)\)


3.4 与最大公约数的结合

来源:[省选联考 2020 A 卷] 作业题

给定一张 \(n\) 个点的无向带权图 \(G\),无重边、自环,求它的所有生成树的权值和。

其中权值定义为树中边权之和与边权的最大公约数的乘积。答案对大质数取模。

\(n\le 30\),边权是 \([1,152501]\) 中的整数。

直接列出所求:

\[\sum_T\Bigg(\Big(\sum_{e\in T}w_e\Big)\cdot\gcd_{e\in T}w_e\Bigg) \]

由欧拉反演

\[n=\sum_{d|n}\varphi(d) \]

可得

\[\sum_T\Bigg(\Big(\sum_{e\in T}w_e\Big)\cdot\sum_d\varphi(d)[d|\gcd_{e\in T}w_e]\Bigg) \]

枚举 \(\gcd\)

\[\sum_d\varphi(d)\Bigg(\sum_T\Big(\sum_{e\in T}w_e\Big)\cdot[\forall e\in T,d|w_e]\Bigg) \]

对于每个 \(d\),利用 3.2 中的方法套一次 Matrix-Tree 定理。时间复杂度 \(O(n^3V)\),其中 \(V\) 为值域。

实际上一个 \(d\) 会产生贡献当且仅当至少有 \(n-1\) 条边是它的倍数,对无用的 \(d\) 进行剪枝后可以通过。


3.5 与容斥原理的结合

来源:P4336 [SHOI2016] 黑暗前的幻想乡

初始有一张 \(n\) 个点的没有边的无向图 \(G\)

对于 \(i=1,2,\cdots,n-1\),给出一个数 \(m_i\) 和一个不重的边集 \(S_i\),满足 \(|S_i|=m_i\)。在每个 \(S_i\) 中选出一条边,问能使得 \(G\) 连通的方案数。答案对大质数取模。

\(2\le n\le 17\)

把每个集合 \(S_i\) 视作边的颜色,转化题意:选择 \(n-1\)颜色各异的边是它们构成一棵树的方案数,且颜色总数为 \(n-1\)

直接使用 Matrix-Tree 定理会计入有重复颜色的情况,考虑用容斥原理解决这个问题。

具体地,设 \(f(i)\) 表示只考虑 \(i\) 种颜色,能够选出的生成树数量(可以选颜色重复的边)。

所求即为

\[\sum_{i=1}^{n-1}(-1)^{n-1-i}f(i) \]

对于 \(f(i)\),考虑状态压缩后二进制下每个大小为 \(i\) 的子集,对该集合内的颜色的所有边套用一次 Matrix-Tree 定理计算生成树个数即可。

时间复杂度 \(O(2^nn^3)\)


3.6 Cayley 公式

假设 \(G\) 是一张有 \(n\) 个点的完全无向图,它的 \(\mathrm{Kirchhoff}\) 矩阵为

\[K(G)=\begin{bmatrix}n-1&-1&\cdots&-1\\-1&n-1&\cdots&-1\\\vdots&\vdots&\ddots&\vdots\\-1&-1&\cdots&n-1\end{bmatrix}_{n\times n} \]

可以证明它的主子式的特征值为 \(n^{n-2}\)。于是可以得到 Cayley 公式:

大小为 \(n\) 的带标号的无根树有 \(n^{n-2}\) 个。

Cayley 公式也可以用 Prüfer 序列推出,它是一个长为 \(n-2\) 的序列,与完全图的生成树形成双射。


3.7 BEST 定理

忘保存了。


4. 总结

有关图的生成树的计数问题大部分都与 Matrix-Tree 定理相关。我们通常需要对题目条件进行转化,然后应用 Matrix-Tree 定理对生成树进行计数或统计某些权值的和。此外,Matrix-Tree 定理可以推广至 Cayley 公式,可以用于解决若干完全图上的组合计数问题。

posted @ 2024-02-03 10:41  SError  阅读(11)  评论(1编辑  收藏  举报