关于行列式在生成树上的应用(行列式、矩阵树定理)
0. 问题引入
给出一张有 \(n\) 的点无向图 \(G\)(可以存在重边、自环),求它的生成树个数。
\(n\le300\),答案对大质数取模。
当遇到需要对一张图的所有生成树中的信息进行统计时,没有十分好的入手角度,需要 Matrix-Tree 树定理进行辅助。
1. 行列式引入
1.1 行列式的定义
对一个 \(n\times n\) 的矩阵 \(A\),其 \(n\) 阶行列式写作 \(\det A\) 或 \(|A|\),定义为
所有的 \(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)\)。
- 矩阵转置后行列式值不变。
等价于证明
强严格地,考虑证明 \((-1)^{\tau(p)}=(-1)^{\tau(p')}\),其中 \(p'\) 是 \(p\) 的逆排列,满足 \(p'_{p_i}=i\)。
\(\tau(p')\) 即按权值排序后下标的逆序对数,有 \(\tau(p)=\tau(p')\),得证。
对原矩阵执行列变换,相当于在转置后的矩阵中执行行变换。于是所有对行满足的性质,对于列而言也满足。下面只考虑行的情况。
- 行列式的行(列)所有元素等比例变化,则行列式等比例变化。
- 交换行列式两行(列),行列式值反号。
相当于交换原排列的两位置,\(\tau(p)\) 奇偶性改变,行列式值反号。
- 若行列式两行(列)成比例,则行列式值为 \(0\)。
将该比例提出,则交换两行后行列式取反且不变,故行列式为 \(0\)。
- 将行列式某行(列)的值拆为两部分,行列式求和后与原行列式值相等。
- 将矩阵的一行(列)的值全部乘一个常数 \(k\) 加到另一行(列)上,行列式值不变。
利用上一条性质将增量拆出来,易得行列式的变量为 \(0\)。
1.4 行列式求值
一般要求计算行列式对某个数 \(p\) 取模的值。
1.4.1 模数为质数
上三角方阵 \(A\) 的行列式为 \(\prod_{i=1}^{n}a_{i,i}\)。
于是对任意方阵 \(A\),只需使用高斯消元将 \(A\) 行化简为上三角矩阵即可。主要流程与手动行化简基本相同,例如:
求得 \(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)\),其中
- 对于有向图,定义图 \(G\) 的入度矩阵 \(D^{in}(G)\) 与出度矩阵 \(D^{out}(G)\),其中
- 定义图 \(G\) 的邻接矩阵 \(A(G)\),其中
-
定义图 \(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\) 矩阵,其中
无向图中边的方向可以随意,即若编号为 \(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 定理
只考虑证明无向图的情况:
\(K_{i,i}(G)\) 表示将 \(K(G)\) 的第 \(i\) 行和第 \(i\) 列删除后的矩阵,也就是说 \(K(G)\) 的所有 \(n-1\) 阶主子式都相等。
Lemma 1
\[M\times M^{T}=K \]
等价于
乘积的贡献非零当且仅当 \(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\) 中的行构成的矩阵。
展开等式右侧:
展开等式左侧:
其中 \(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\) 的排列:
整理后与右式相等。
最后只需证明矩阵树定理删去第 \(n\) 行和第 \(n\) 列是正确的。对于其余的情况,可以将 \(M_0\) 的定义改为删去该行。
与引理 \(1\) 类似地有
其中 \(K_0\) 为 \(K\) 删除最后一行和最后一列的矩阵。
由引理 \(3\) 有
若边集 \(S\) 不构成生成树,贡献为 \(0\);否则由 \(\det M_0[S]=\pm1\),贡献为 \(1\)。
可得 \(\det K_0\) 即原图的生成树数量。
2.3 有向图中的矩阵树定理
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 与概率的结合
一张 \(n\) 个点的无向图,两点 \(i,j(i<j)\) 间存在边的概率是 \(p_{i,j}\),无自环。
问恰有 \(n-1\) 条边且这些边构成图的生成树的概率,精度要求 \(10^{-3}\)。
\(n\le 50\)。
所求为
将 \(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 与最大公约数的结合
给定一张 \(n\) 个点的无向带权图 \(G\),无重边、自环,求它的所有生成树的权值和。
其中权值定义为树中边权之和与边权的最大公约数的乘积。答案对大质数取模。
\(n\le 30\),边权是 \([1,152501]\) 中的整数。
直接列出所求:
由欧拉反演
可得
枚举 \(\gcd\):
对于每个 \(d\),利用 3.2 中的方法套一次 Matrix-Tree 定理。时间复杂度 \(O(n^3V)\),其中 \(V\) 为值域。
实际上一个 \(d\) 会产生贡献当且仅当至少有 \(n-1\) 条边是它的倍数,对无用的 \(d\) 进行剪枝后可以通过。
3.5 与容斥原理的结合
初始有一张 \(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\) 种颜色,能够选出的生成树数量(可以选颜色重复的边)。
所求即为
对于 \(f(i)\),考虑状态压缩后二进制下每个大小为 \(i\) 的子集,对该集合内的颜色的所有边套用一次 Matrix-Tree 定理计算生成树个数即可。
时间复杂度 \(O(2^nn^3)\)。
3.6 Cayley 公式
假设 \(G\) 是一张有 \(n\) 个点的完全无向图,它的 \(\mathrm{Kirchhoff}\) 矩阵为
可以证明它的主子式的特征值为 \(n^{n-2}\)。于是可以得到 Cayley 公式:
大小为 \(n\) 的带标号的无根树有 \(n^{n-2}\) 个。
Cayley 公式也可以用 Prüfer 序列推出,它是一个长为 \(n-2\) 的序列,与完全图的生成树形成双射。
3.7 BEST 定理
忘保存了。
4. 总结
有关图的生成树的计数问题大部分都与 Matrix-Tree 定理相关。我们通常需要对题目条件进行转化,然后应用 Matrix-Tree 定理对生成树进行计数或统计某些权值的和。此外,Matrix-Tree 定理可以推广至 Cayley 公式,可以用于解决若干完全图上的组合计数问题。