笔记:矩阵树定理
矩阵树定理,顾名思义,它通过对一张图构造矩阵,用线性代数的手段,解决了图的生成树计数问题。
本文侧重于结论证明,可能不添加例题。
推导 & 证明
给定有向图 \(G = (V,E)\),记 \(n=|V|,m=|E|\),求这张图根向生成树个数,记为 \(t(G)\)。
根向生成树:除根节点之外,所有点都指向父亲。
定义 \(G\) 的出度矩阵 \(D(G)\):\(D(G)_{i,j}=\begin{cases} \mathrm{out}_i & i=j \\ 0 & i \ne j \end{cases}\)。其中 \(\mathrm{out}_i\) 是 \(i\) 的出度。
定义 \(G\) 的邻接矩阵 \(A(G)\):\(A(G)_{i,j} = \begin{cases} 1 & (i,j)\in E \\ 0 & (i,j)\notin E \end{cases}\)。
构造 Laplace 矩阵 \(L(G)=D(G)-A(G)\)。
如果图有自环,可以看作 \(D(G)_{i,i}\) 和 \(A(G)_{i,i}\) 同时加一,减去后抵消掉了,因此我们可以默认 \(G\) 不存在自环。
可以看到 Laplace 矩阵在对角线记录了出度信息,其它位置记录了边的情况,并且每行之和都为 \(0\)。
我们给出矩阵树定理对于根向生成树的形式(其他形式会在推导结束后自然引出):
明确符号:
记 \([n]=\{1,2,\cdots,n\}\)。
对于矩阵 \(A\),我们记 \(A_{S,T}\) 表示提取 \(S\) 中的行和 \(T\) 中的列构成的 \(A\) 的子矩阵。
而 \(A_{-i,-j}\) 表示 \(A_{[n]\setminus\{i\},[n]\setminus\{j\}}\)。
其中 \(i\) 像是在枚举生成树的根,下面我们来证明这一点。
首先要引入一个非常重要的公式,Cauchy-Binet 公式(暂时不放证明,因为笔者还不会):
对于 \(n\times m\) 的矩阵 \(A\) 和 \(m\times n\) 的矩阵 \(B\),有:
\[\det(AB) = \sum\limits_{S\subseteq[m],|S|=n} \det(A_{[n],S})\cdot\det(B_{S,[n]}) \]
这个定理重要的是枚举子集 \(S\),如果我们枚举的是 \(S\subseteq E\),且 \(|S|=n-1\),然后通过某种方式判断该边子集是否构成合法生成树,就可以得到答案。
于是我们要把 \(L(G)\) 拆成两个矩阵的乘积。由于 \(L(G)=D(G)-A(G)\),也就是要做一个类似提取公因数的事情。
构造 \(n\times m\) 的矩阵 \(B\) 和 \(n\times m\) 的矩阵 \(C\),满足:
相当于 \(B\) 记录哪些边以 \(i\) 为起点,\(C\) 记录哪些边以 \(i\) 为终点。
不难发现,\(B\times B^{T}=D(G)\),\(B\times C^{T}=A(G)\),于是 \(L(G)=B\times(B^{T}-C^{T})\)。
记 \(H=B^T-C^T\)。
因此:
之后的目标非常明确,即证明当 \(S\) 是合法生成树是,\(\det(B_{-i,S})\cdot\det(H_{S,-i})=1\),否则为 \(0\)。
不妨先分析一下这两个矩阵的性质:
-
\(B\) 的每一列恰好有一个 \(1\),因为我们删去了第 \(i\) 行,所以 \(B_{-i,S}\) 每一列至多一个 \(1\)。
然后 \(B_{-i,S}\) 的每一行反映了其出边。如果存在一个不为 \(i\) 的点一个出边都没有,说明该行全 \(0\),那么 \(\det(B_{-i,S})=0\)。
-
对于 \(H_{S,-i}\),不难发现,每一行所代表的边,在起点处是 \(1\),终点处是 \(-1\)。
由于删去了第 \(i\) 列,所以 \(H_{S,-i}\) 每一行至多一个 \(1\) 和一个 \(-1\)。
如果选出的边集 \(S\) 不是弱连通的,一定可以找到一个不包含 \(i\) 的弱连通块,记点集为 \(T\),显然 \(H_{S,T}\) 中每一行恰好一个 \(1\) 和一个 \(-1\),即行和为 \(0\),于是可以通过对 \(T\) 中的列做初等列变换(倍加)把所有列加起来,使得 \(H_{S,-i}\) 存在全 \(0\) 列,于是 \(\det(H_{S,-i})=0\),即 \(\det(B_{-i,S})\cdot\det(H_{S,-i})=0\)。
如果选出的边集 \(S\) 是弱连通的,但不是合法生成树,
- 如果 \(\mathrm{out}_i>0\),显然不合法,因为只有 \(n-1\) 条边,所以一定存在一个点 \(j\),\(\mathrm{out_j}=0\),此时 \(\det(B_{-i,S})=0\)。
- 如果 \(\mathrm{out}_i=0\),但存在一个点 \(j\),\(\mathrm{out}_j>1\),同理,一定存在另一个点 \(k\),\(\mathrm{out}_k=0\),此时 \(\det(B_{-i,S})=0\)。
- 否则,\(\mathrm{out}_i=0\),且其他点的出度恰好为 \(1\),且 \(S\) 弱连通,那么 \(S\) 就是合法根向生成树了!
当 \(S\) 是合法生成树时,考虑不断进行如下调整,直到 \(H_{S,-i}\) 不存在 \(-1\):
- 找到一个叶子 \(u\) 以及出边 \(e\),
- 如果 \(H_{e,-i}\) 这一行只有 \(H_{e,u}=1\),说明 \(e\) 的终点是 \(i\),结束过程。
- 否则,设 \(H_{e,v}=-1\),继续考虑 \(v\) 的出边 \(e'\),显然 \(H_{e',v}=1\)。
- 如果 \(H_{e',-i}\) 这一行只有 \(H_{e',v}=1\),那么把 \(H_{e',-i}\) 加到 \(H_{e,-i}\) 上即可使 \(H_{e,v}=0\)。
- 否则,递归下去考虑 \(v\) 作为叶子,直到 \(H_{e',-i}\) 中的 \(-1\) 被消掉后,再消掉 \(H_{e,-i}\) 的 \(-1\)。
经过上述操作,不难发现 \(H_{S,-i}\) 每一行记录了该边的起点,而这恰好是 \(B^T_{S,-i}\)!
根据倍加操作不改变行列式,我们有 \(\det(H_{S,-i})=\det(B^T_{S,-i})\)。
而又根据转置不改变行列式,得到 \(\det(B_{-i,S})\cdot\det(H_{S,-i})=\det(B_{-i,S})^2\)。
又因为 \([n]\setminus\{i\}\) 的每个点恰好有一个出边,因此可以通过初等行变换(对换)使得 \(B_{-i,S}\) 变为单位矩阵,那么 \(\det(B_{-i,S})^2=1\)。
综上所述,我们证明了该结论。
结论
根向生成树
叶向生成树
叶向生成树:除了根,所有点都被父亲指向的生成树。
相当于根向生成树把所有边翻转,于是只需把 \(D(G)\) 从出度矩阵变为入度矩阵即可。理论上要用 \(A(G)^T\),但转置后行列式是不变的,所以不影响。
无向图生成树
相当于每条无向边换成两条相反的有向边,然后随便指定根即可。
此时 \(D(G)\) 应该是度数矩阵。

浙公网安备 33010602011771号