简单理解 Matrix-Tree 定理

发布时间 2023-03-31 18:07:37作者: 云浅知处

首先,我们要知道,一个矩阵的行列式可以使用高斯消元来求。

定义无向图的 Laplace 矩阵:\(L_{i,j}=D_{i,j}-G_{i,j}\),其中 \(D\) 是度数矩阵,满足 \(i=j\)\(D_{i,i}=deg_i\),其余时刻 \(D_{i,i}=0\)\(G\) 是邻接矩阵,\(G_{i,j}\) 表示两点间是否有边(有重边就是边数)。Matrix-Tree 定理就是:

  • 无向图的生成树个数就是其 Laplace 矩阵的任何一个 \(L_{i,i}\) 的代数余子式的值。

对于有向图,重新定义 \(D_{i,i}\) 表示 \(i\) 的出度,那么以 \(i\) 为根的根向树形图个数就是 \(L_{i,i}\) 的代数余子式;叶向树形图反过来就行了。

有时候定义生成树的权值是所有边权的乘积,考虑边权为正整数的情形,发现只需要添加若干条重边即可,体现在 \(G\) 上即为直接修改为边权;进一步,边权是任意实数的情形也可以这么做。

有时候定义生成树的权值是所有边权之和,这时我们发现等价于钦定某条边被选中,剩下的边随意的方案数,乘上这条边的权值,之和。发现只需要在每条边 \(i\) 上写一个多项式 \(1+w_ix\),求出最终得到的“代数余子多项式”(因为最终得到的行列式是一个多项式)的一次项系数即可。

北京集训 2019 那个题是较一般化的情况,不难发现此时只需要求 \(k\) 此项系数。

P6178

板题

P4436

要求每个集合选一条边得到一棵生成树

相当于每个集合至少选一条边,钦定 \(S\) 以内集合不选边做容斥即可,容斥系数为 \((-1)^{|S|}\)

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

P6624

首先套路反演一波,设 \(W(T)\) 表示生成树 \(T\) 的边权集合,\(\gcd(S)\) 表示 \(S\) 以内所有数的 \(\gcd\)\(\text{sum}(S)\) 表示 \(S\) 以内所有数之和

\[\sum_T\gcd(W(T))\times \text{sum}(W(T))=\sum_{d=1}^{V}\varphi(d)\sum_{d|\gcd(W(T))}\text{sum}(W(T)) \]

相当于保留所有边权为 \(d\) 的倍数的边,求所有生成树的权值和。

在每条边上写个多项式 \(1+w_ix\),重新定义 \(D\) 表示这个点的邻边上所有多项式之和,\(G\) 类似,求出最终的行列式(这是一个多项式),一次项系数就是所有生成树的权值和。

现在考虑多项式怎么做高斯消元;发现只需要在 \(\bmod x^2\) 意义下做多项式乘法,多项式求逆等等。发现性质相当好,只要常数项不为 \(0\),多项式就一定存在逆。具体来说有

\[(a+bx)^{-1}\equiv \frac{1}{a}-\frac{b}{a^2}x\pmod{x^2} \]

直接暴力算就行了,复杂度大概是 \(O(n^3\sum d(w_i))\),不会超过 \(n^4\times \max d(w_i)\le 2\times 10^8\)

P5296

类似地,我们只需要在 \(\bmod x^k\) 意义下做多项式乘法,多项式求逆。

矩阵树定理的内容实际上是:Laplace 矩阵的任意一个 \(L_{i,i}\) 的代数余子式等于 \(\sum_T\prod_{(u,v)\in T}w(u,v)\),这个 \(w\) 可以是任意东西,只要他有乘法有的性质就行。

发现这个东西类似于 EGF,他的卷积形式形如

\[(a+b)^k=\sum_{i=0}^k\binom{k}{i}a^ib^{k-i}\iff \dfrac{(a+b)^k}{k!}=\sum_{i=0}^{k}\dfrac{a^i}{i!}\times \dfrac{b^{k-i}}{(k-i)!} \]

维护 \(\text{e}^{w_ix}\) 的多项式操作即可。复杂度 \(O(n^3k^2)\),当然可以做到 \(O(n^3k\log k)\)

现在我们会维护权值为 \(k\) 次方和、乘积两种形式了。思考一下其他形式:

  • \(\text{or/and/xor}\):拆位后,\(\text{and}\) 相当于只保留边权为 \(1\) 得边,\(\text{or}\) 反过来就行;\(\text{xor}\) 只需要在 \(0\) 边上写一个 \(1\),边权为 \(1\) 的边上写一个 \(x\),在 \(\bmod x^2\) 意义下做多项式乘法就行了。
  • \(\gcd/\text{lcm}/[\gcd =1]\):利用数论反演技巧即可。
  • \(\max/\min\):首先我们要知道钦定某条边必选的生成树计数怎么算:把这条边的边权设为 \(0\) 即可求出不选的方案,设为 \(1\) 即为随意的方案,二者相减即可。接下来只需要钦定 \(\max\) 计数即可。
  • 感觉这些都很无聊,大部分好像都能用多项式技巧表达!

P5406

考虑直接计数,发现题目中那个东西,其实也可以看作某种 FWT。

FWT 是线性变换,符合 matrix tree 的要求,因此先把边权都 FWT 掉然后做点积,再 IFWT 就做完了。

时间复杂度 \(O(mw2^w+n^32^w)\)