计数:Matrix-Tree 定理
作为一个生成树计数中的一个重要定理,Matrix-Tree 拥有通用性强和大家都不会证明的双重优点。
Laplace 矩阵
亦称 Kirchhoff 矩阵。
无向图的 Laplace 矩阵
我们定义 Laplace 矩阵 \(L = D-A\),其中 \(D\) 是该图的度数矩阵,\(A\) 是该图的邻接矩阵。
我们规定
至于邻接矩阵,不必多言。
我们不妨记无向图 \(G\) 的生成树个数为 \(t(G)\)。
有向图的 Laplace 矩阵
我们定义有向图的出度 Laplace 矩阵 \(L^{\mathrm{out}}=D^{\mathrm{out}}-A\),入度 Laplace 矩阵 \(L^{\mathrm{in}}=D^{\mathrm{in}}-A\),其中 \(D^{\mathrm{out}}\) 是该图的出度矩阵,\(D^{\mathrm{in}}\) 是该图的入度矩阵。
我们规定
同理,有
我们不妨记有向图 \(G\) 以 \(k\) 为根的\(^\dag\)内向生成树个数为 \(t^{\mathrm{in}}(G,k)\),以 \(k\) 为根的外向生成树个数为 \(t^{\mathrm{out}}(G,k)\)。
\(^\dag\)内向生成树:有向图生成的满足所有子节点都只向父节点连有向边的树,如下图所示的树即为一棵以节点 \(3\) 为根的内向树。

同理,外向生成树即有向图生成的满足所有父节点都只向子节点连有向边的树。
Matrix-Tree 定理
定理内容
无向图的 Matrix-Tree 定理
一个无向图 \(G\),对于 \(\forall k\in[1,n]\cap \mathbb Z\),都有
其中 \(\det A\) 是对 \(A\) 的行列式求值的结果。
即无向图 Laplace 矩阵的所有 \(n-1\) 阶主子式的值与该图的生成树个数均相等。
如果你不会行列式求值,click here。
有向图的内向生成树的 Matrix-Tree 定理
一个有向图 \(G\),对于 \(\forall k\in[1,n]\cap \mathbb Z\),都有
即有向图的出度 Laplace 矩阵删去第 \(k\) 行第 \(k\) 列得到的主子式的值与该图的内向生成树的个数相等。
有向图的外向生成树的 Matrix-Tree 定理
一个有向图 \(G\),对于 \(\forall k\in[1,n]\cap \mathbb Z\),都有
即有向图的入度 Laplace 矩阵删去第 \(k\) 行第 \(k\) 列得到的主子式的值与该图的外向生成树的个数相等。
带权无向图的 Matrix-Tree 定理
一个无向图 \(G\),对于 \(\forall k\in[1,n]\cap \mathbb Z\),都有
其中 \(\mathcal T(G)\) 是图 \(G\) 的生成树集合。
带权有向图的内向生成树的 Matrix-Tree 定理
一个有向图 \(G\),对于 \(\forall k\in[1,n]\cap \mathbb Z\),都有
其中 \(\mathcal T^{\mathrm{in}}(G,k)\) 是图 \(G\) 的内向生成树集合。
带权有向图的外向生成树的 Matrix-Tree 定理
一个有向图 \(G\),对于 \(\forall k\in[1,n]\cap \mathbb Z\),都有
其中 \(\mathcal T^{\mathrm{out}}(G,k)\) 是图 \(G\) 的外向生成树集合。
定理证明
Cauchy-Binet 公式
对于一个 \(n\times m\) 的矩阵 \(A\) 和一个 \(m\times n\) 的矩阵 \(B\),有
证法一
若 \(n>m\),由于
其中 \(\operatorname{rank}(A)\) 为矩阵 \(A\) 的秩,故 \(\det(AB)=0\)。
若 \(n=m\),该式显然成立。
下面论证 \(n<m\) 的情况。
记 \(I_n\) 为 \(n\) 阶单位矩阵。
首先有引理
于是有
考虑证明。
当 \(\lambda=0\) 时,显然成立。
当 \(\lambda\ne 0\) 时,
设 \(P=(p_{ij})_{n,n}\),设展开式系数
下证 \(c_k\) 为 \(P\) 中所有 \(k\) 阶主子式值之和。
不妨引入 Kronecker 符号
则
考虑其中对 \(\lambda^{n-k}\) 项系数有贡献的部分。
对于 \(\forall \sigma \in S_n\),设
则有
则我们证明了该引理。
接下来考虑证明 Cauchy-Binet 公式。
考察左右两侧 \(\lambda^{n-m}\) 项系数,
故
证法二
直接暴力计算。
Cauchy-Binet 公式表明,Laplace 矩阵的主子式其实是一系列子结构的和,每个子结构都反映了对应子图的性质。
对于 Cauchy-Binet 公式的证明,可以看看这篇。
关联矩阵
我们规定不带权无向图的关联矩阵 \(M\) 为
考虑拓展到带权有向图,容易得知出度关联矩阵 \(M^{\mathrm{out}}\) 为
出度关联矩阵 \(M^{\mathrm{in}}\) 为
显然有
进而有
引理
对于 \(G\) 的一个子图 \((W,S)\),若 \(|W|=|S|\le n\),则
子图 \(G_s=(V,S)\) 是一个以 \(V\setminus W\) 为根节点集的内向森林,当且仅当
且当上式成立时,其值必然为
记之为 \(w(G_s)\)。
引理的证明
证明我不是很会,可以去 OI-Wiki 查看。
现在可以证明 Matrix-Tree 定理了。
我们以带权有向图的内向生成树的 Matrix-Tree 定理为例,记 \(W=[n]\setminus\{k\}\) 为除去节点 \(k\) 后的点集。
带权有向图的内向生成树的 Matrix-Tree 定理
一个有向图 \(G\),对于 \(\forall k\in[1,n]\cap \mathbb Z\),都有
其中 \(\mathcal T^{\mathrm{in}}(G,k)\) 是图 \(G\) 的内向生成树集合。
证明
根据 Cauchy-Binet 公式,有
由关联矩阵引理,当且仅当 \(T\) 是一个以 \(k\) 为根的内向树时,右侧累加一个 \(w(T)\)。
Cayley 公式
\(n\) 个节点的有标号不同构无根树数量为 \(n^{n-2}\)。
证法一:一一对应
考虑利用组合数学证明。
钦定 \(T\) 是其中一棵树,叶子节点中标号最小的记为 \(a_1\),\(a_1\) 的邻接点(即有根树中的父亲)记为 \(b_1\),从图中删去 \(a_1\) 及所有连边,\(b_1\) 便成为这棵树的顶点。
在余下的树 \(T_1\) 中,叶子节点中标号最小的记为 \(a_2\),\(a_2\) 的邻接点记为 \(b_2\),从图中删去 \(a_2\) 及所有连边,\(b_2\) 便成为这棵树的顶点。
如此步骤继续 \(n-2\) 次,直到剩下最后一条边,于是一棵树 \(T\) 对应一个序列
其中 \(b_i\in [1,n] \cap \mathbb Z\),并且允许重复。
为何允许重复比较易懂,留给读者自行思考。
现在证明一个序列对应一棵树。
我们不妨再引入一个序列
其中 \(c_i=i\)。
在序列 \(c\) 中找出第一个不出现在序列 \(b\) 中的数,显然,这个数是 \(a_1\),同时,我们有了一条边 \((a_1,b_1)\),我们从 \(c\) 中消去 \(a_1\),从 \(b\) 中消去 \(b_1\),在余下的部分中继续执行此操作 \(n-2\) 次。最后,\(c\) 中剩余两个数,即为 \(a_{n-1}\) 和 \(b_{n-1}\),是树 \(T\) 的最后一条边。
于是我们证明了序列 \(b\) 和树 \(T\) 一一对应。
考虑计数,由于序列 \(b\) 可重,故总方案数为
序列 \(b\) 也称为树 \(T\) 的 Prüfer 序列。
证法二:Matrix-Tree 定理
不妨转化问题,我们发现原问题等价于求 \(n\) 个顶点的完全图的生成树数量。
我们写出 Laplace 矩阵
计算其任意 \(n-1\) 阶主子式,有
应用无向图的 Matrix-Tree 定理,原命题得证。
BEST 定理
设 \(G\) 为有向欧拉图,\(k\) 为任意顶点,则 \(G\) 的不同欧拉回路个数
BEST 定理表明,对于 \(\forall k,k'\in V_G\),都有 \(t^{\mathrm{in}}(G,k)=t^{\mathrm{in}}(G,k')\)。
证明
考虑图 \(G\) 的任意一棵内向树,对于每个节点 \(u\),我们给以 \(u\) 为起点的所有不在内向树上的 \(\deg(u)-1\) 条出边一个顺序,称这个根向树及这个出边的排列顺序为一个组合。
于是我们只需要证明组合和欧拉回路一一对应。
考虑从根节点开始,每到达一个节点,若不在内向树上的出边都被走过了,就沿着根向树上的边走向其父亲,否则就按照出边的排列顺序走向下一个节点。
注意到这样只会经过每个节点至多一次,现在证明这样会经过且仅经过每个节点一次。
不妨设到达节点 \(u\) 后无法移动,考虑分类讨论。
若 \(u\) 不是根节点,我们经过 \(u\) 时会经过其一条入边和一条出边,而无法移动说明只经过了 \(u\) 的一条入边,说明 \(\deg^{\mathrm{in}}(u)=\deg^{\mathrm{out}}(u)+1\),与 \(G\) 为欧拉图矛盾。
这样我们就证明了这种方案一定会形成一个欧拉回路。
现在我们证明了一个组合对应一个欧拉回路,接下来考虑证明一个欧拉回路对应一个组合。
记 \(e_u\) 为 \(u\) 最后访问的入边,下面证明所有 \(e_u\) 构成一棵内向树。
不妨设 \(e_u\) 构成的图中有环,首先根节点必然不会出现在环上。现在环上找出任意一个节点 \(u\),容易发现 \(u\) 沿着环的方向可以再次回到 \(u\)。由于原图是欧拉图,\(\deg^{\mathrm{in}}(u)=\deg^{\mathrm{out}}(u)\),而 \(u\) 在环上回到 \(u\) 会导致 \(\deg^{\mathrm{in}}(u)=\deg^{\mathrm{out}}(u)+1\),矛盾,故所有 \(e_u\) 构成树。
其实我觉得到 \(\deg^{\mathrm{in}}(u)=\deg^{\mathrm{out}}(u)\) 即可推出结论,因为这说明根节点与这个环的任意一个节点没有连边。
于是一个组合和一个欧拉回路一一对应。
典例
SP104 HIGH - Highways
直接连边后求出 Laplace 矩阵,删去任意一个点后高斯消元求解即可。
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%lld%lld",&u,&v);
a[u][v]--;
a[v][u]--;
a[u][u]++;
a[v][v]++;
}
ans=det(n-1);
P4111 [HEOI2015] 小 Z 的房间
同样地,求出 Laplace 矩阵后高斯消元求解即可。
P3317 [SDOI2014] 重建
给定了 Laplace 矩阵,直接高斯消元求解。
P4208 [JSOI2008] 最小生成树计数
先跑最小生成树,若没有直接输出 \(0\),由于权值相同边至多 \(10\) 条,一边并查集合并一边求行列式,最后将贡献加起来即可。
if(!kruskal(n,m))
{
printf("0\n");
return 0;
}
int ans=1;
for(int i=1;i<=cntv;i++)
{
init(n);
for(int j=1;j<n&&tr[j].w!=v[i];j++)
merge(tr[j].u,tr[j].v);
for(int j=n-1;j>=1&&tr[j].w!=v[i];j--)
merge(tr[j].u,tr[j].v);
cntb=0;
for(int j=1;j<=n;j++)
if(fa[j]==j)
b[j]=++cntb;
for(int j=1;j<=n;j++)
b[j]=b[find(j)];
memset(a,0,sizeof a);
for(int j=1;j<=m;j++)
{
if(e[j].w!=v[i])
continue;
a[b[e[j].u]][b[e[j].v]]--;
a[b[e[j].v]][b[e[j].u]]--;
a[b[e[j].u]][b[e[j].u]]++;
a[b[e[j].v]][b[e[j].v]]++;
}
ans=ans*det(cntb-1)%mod;
}
P2143 [JSOI2010] 巨额奖金
和最小生成树计数是一个题,略微转化即可。
P6178 【模板】Matrix-Tree 定理
无向边变为了有向边。建立 Laplace 矩阵的时候删去一半即可,删去的一半和剩下的一半只要对称即可。
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
if(u==1||u==n)
u=n-u+1;
if(v==1||v==n)
v=n-v+1;
a[u][v]=(a[u][v]-w+mod)%mod;
a[v][v]=(a[v][v]+w)%mod;
if(!t)
{
a[v][u]=(a[v][u]-w+mod)%mod;
a[u][u]=(a[u][u]+w)%mod;
}
}
printf("%lld\n",det(n-1));
P2144 [FJOI2007] 轮状病毒
这里讲一种很无脑的做法。
求出 Laplace 矩阵,直接删去中间点后消元,删去中间点的过程可以简化为 \(a_{ii}\gets a_{ii}+1\)。
高精计算即可,注意优化高精度。
P4455 [CQOI2018] 社交网络
也是有向图形式的 Matrix-Tree 定理板子。同样高斯消元求解即可。
P5296 [北京省选集训2019] 生成树计数
建立 Laplace 矩阵时矩阵内的值变成了多项式,考虑 \(\exp\) 形式后就很好做。
K++;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int w;
scanf("%lld",&w);
if(i>j)
continue;
poly tmp=exp(w);
a[i][j]=a[i][j]-tmp;
a[j][i]=a[j][i]-tmp;
a[i][i]=a[i][i]+tmp;
a[j][j]=a[j][j]+tmp;
}
printf("%lld\n",det(n-1)[K-1]*fac[K-1]%mod);
P6624 [省选联考 2020 A 卷] 作业题
是上一题的弱化版。以同一种方式考虑即可。
P5807 【模板】BEST 定理 | Which Dreamed It
BEST 定理的直接应用。套用 BEST 定理直接计算即可。
P7531 [USACO21OPEN] Routing Schemes P
有人说很难看出来是 BEST 定理,我觉得很显然。直接套用 BEST 定理即可,注意起点和终点的处理,使用一种类似网络流的形式建立超级源点和超级汇点即可。
编者按
本文在洛谷、博客园和 CSDN 更新。后续可能会补充。

浙公网安备 33010602011771号