Kirchhoff Matrix-Tree 定理学习笔记

定理描述

\(G\) 是一个无向图,定义度数矩阵 \(D(G)\) 为:

\[D(G) = \begin{pmatrix} deg_1&0&\cdots &0 \\ 0&deg_2&\cdots &0 \\ \vdots &\vdots & \ddots &\vdots \\ 0&0&\cdots &deg_n \end{pmatrix} \]

\(e(i,j)\) 表示 \(i,j\) 之间相连的变数,定义邻接矩阵 \(A(G)\) 为:

\[A(G) = \begin{pmatrix} 0&e_{1,2}&\cdots &e_{1,n} \\ e_{2,1}&0&\cdots &e_{2,n} \\ \vdots &\vdots & \ddots &\vdots \\ e_{n,1}&e_{n,2}&\cdots &0 \end{pmatrix} \]

定义 Laplace 矩阵(亦称 Kirchhoff 矩阵)\(L(G)\) 为:

\[L(G)=D(G)-A(G) \]

\(G\) 的所有生成树边权的乘积的和(当边权为 \(1\) 时就是生成树个数)为 \(t(G)\)

则有:

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

\(L(G)_{i,i}\)\(|L(G)|\)\((i,i)\)\(a_{ii}\) 的余子式。

这里你可以发现,Laplace 矩阵的所有余子式相等(也是条性质)。

并且,对于所有 \(L(G)\)\(n-1\) 个特征值 \(\lambda_{1},\cdots,\lambda_{n-1}\),满足:

\[t(G) = \frac{1}{n} \prod\limits_{i=1}^{n} \lambda_{i} \]

有向图的话:

  • 若是要统计内向树的个数(记作 \(t^{in}(G,i)\),表示以 \(i\) 为根的内向树),则统计每个点向外的度数和每个点向外连的边(即 \(e(i,j)\) 代表 \(i\)\(j\) 连的边),分别记作 \(D^{out}(G),A^{out}(G),L^{out}(G)=D^{out}(G)-A^{out}(G)\)

  • 若是统计外向树,则与上面相反。

然后也有:

\[t^{in}(G,i) = L^{out}(G)_{i,i} \\ t^{in}(G,i) = L^{in}(G)_{i,i} \]

证明先咕着,等我学学线代(话说同寄大学数学系编的玩意儿真难懂)。

【模板】Matrix-Tree 定理&[CQOI2018]社交网络

板子。

[SHOI2016]黑暗前的幻想乡

暴力容斥。

原题要求恰好 \(n\) 个公司都选到,我们算至多有 \(n\) 个公司被选到的方案数:\(g(n)\),设答案为 \(f(n)\),则有:

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

于是就有:

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

考虑枚举建筑公司的选择情况,然后矩阵树定理。

ljy 他们的题单的 CF53? 也是这种做法

[SDOI2014]重建

考虑到题目要我们求这个:

\[\sum_{T} \prod\limits_{e\in T} p_{e} \prod\limits_{e \notin T} (1-p_{e}) \]

不好做,考虑把右边那个连乘转成和 \(e\in T\) 相关的,这样才可以用矩阵树定理做,因为:

\[\prod\limits_{e \notin T} (1-p_{e}) = \frac{\displaystyle \prod\limits_{e \in G} (1-p_{e})}{\displaystyle \prod\limits_{e \in T} (1-p_{e})} \]

所以我们有:

\[\sum_{T} \prod\limits_{e\in T} p_{e} \prod\limits_{e \notin T} (1-p_{e}) \\ =\sum_{T} \prod\limits_{e\in T} p_{e} \frac{\displaystyle \prod\limits_{e \in G} (1-p_{e})}{\displaystyle \prod\limits_{e \in T} (1-p_{e})} \\ =\prod\limits_{e \in G} (1-p_{e}) \sum_{T} \prod\limits_{e\in T} \frac{p_{e}}{1-p_e} \]

注意 \(p_e=1\) 的情况需要加上 \(eps\) 随机扰动一下。

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

很经典(对我来说不是)的套路。

先莫反:

\[\sum_{T} \left(\sum\limits_{i=1}^{n-1} w_{e_i}\right) \times \gcd(w_{e_1},w_{e_2},\dots,w_{e_{n-1}}) \\ = \sum_{T} \left(\sum\limits_{i=1}^{n-1} w_{e_i}\right) \times \sum_{d|w_{e_i},e_i\in T} [\gcd(w_{e_1},w_{e_2},\dots,w_{e_{n-1}}) ==d] \\ =\sum_{T} \left(\sum\limits_{i=1}^{n-1} w_{e_i}\right) \times \sum_{d|w_{e_i},e_i\in T} \varphi (d) \\ =\sum_{d=1}^{mx_{w}} \varphi (d) \sum_{\forall e_{i}\in T,d|e_{i}} \left(\sum\limits_{i=1}^{n-1} w_{e_i}\right) \]

但我们的 Matrix-Tree 只能求连乘,怎么办?

然后我们发现,如果维护一个多项式 \(w_i x+1\),维护它的一次项系数,我们会发现:

\[[x]\prod\limits_{i=1}^{n-1} (w_{e_{i}}x+1) = \sum\limits_{i=1}^{n-1} w_{e_i} \]

于是我们考虑到用多项式当做元素去求行列式,于是我们要想办法维护各运算(加,减,乘,除)后的一次项系数,前三者都好处理,关键在于第四种。

对于 \(\displaystyle\frac{ax+b}{cx+d}\)

考虑构造一个 \(Cx+D\),满足 \((Cx+D)(cx+d) \equiv 1 \pmod{x^2}\)

我们把式子拆开:

\[(Cd+Dc)x+Dd = 1 \]

考虑到 \(Dd\) 必须等于 \(1\)

于是:

\[Cd+\frac{c}{d}=0 \\ C=-\frac{c}{d^2} \]

再带回去:

\[\frac{ax+b}{cx+d} = (ax+b)(Cx+D) \equiv \frac{ad-bc}{d^2}x+\frac{b}{d} \pmod{x^2} \]

复杂度 \(O(n^3mx_{w})\),注意求行列式时判断非零的过程即判断常数项是否为 \(0\),求逆元时也是用常数项为 \(1\) 的多项式去求,取反时用一次项系数和常数项都为 \(0\) 的多项式去减。

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

上道题的拓展。

我们考虑两个数加起来的 \(k\) 次方:

\[(a+b)^k = \sum_{i=0}^{k} \binom{i}{k} a^{i}b^{k-i} \\ =k!\sum_{i=0}^{k} \frac{a^{i}b^{k-i}}{i!(k-i)!} \\ =k!\sum_{i=0}^{k} \frac{a^{i}}{i!} \cdot \frac{b^{k-i}}{(k-i)!} \\ =k![x^k]\operatorname{e}^{ax}\operatorname{e}^{bx} \]

两个的情况可以弄成 EGF,那 \(n\) 种的也可以类似。

\[\left(\sum_{i=1}^{n} w_i \right)^k = k![x^k]\prod\limits_{i=1}^{n}\operatorname{e}^{w_ix} \]

所以我们维护一个 EGF:\(\displaystyle\sum_{i=1}^{k} \frac{w_i^k}{i!}\),对这个玩意做矩阵树定理。

PS:判断一个多项式元素是否为 \(0\) 还是得把所有的项都判一遍吧(毕竟这样才能消除对行列式的影响)。

Dead Ends

考虑枚举选择为叶子节点的状态,强制它们被选,对没选的节点做矩阵树定理。

但是,我们没被选的节点也可能成为叶子。

换句话说,我们设选择为叶子节点的状态为 \(S\) 的答案 \(f(S)\),而我们求出来的玩意为 \(g(S)\),就会有:

\[g(S)=\sum_{S\subseteq T} f(T) \]

考虑把集合取反,再容斥。

\[g(\overline{S}) = \sum_{\overline{T}\subseteq \overline{S}} f(\overline{T}) \\ \therefore f(\overline{S}) = \sum_{\overline{T}\subseteq \overline{S}} (-1)^{|\overline{S}|-|\overline{T}|}g(\overline{T}) \]

枚举子集是 \(O(3^n)\),可以用高维差分(或者用 IFWT?反正我不会)做到 \(O(n^22^n)\)

posted @ 2022-07-04 22:05  redproblemdog  阅读(102)  评论(2编辑  收藏  举报