「笔记」数树相关的一些内容


没什么干货,基本上都是瞎写,而且是想到什么写什么,所以可能你看完也学习不到什么。

由于我数学很差,所以可能会写大堆废话 + 大堆错误 + 大堆不带证明的结论。

由于我水平有限,所以写的东西比较显然,内容也十分基础入门。

本篇文章于 2020/11/26 重构。


matrix - tree 定理

先考虑无向图 G:记基尔霍夫矩阵 LG=DGAG,其中 DG 表示度数矩阵,AG 表示邻接矩阵。

则该无向图的生成树数量等于主对角线上任意元素的余子式。

然后就只需要求解行列式,高斯消元即可。

注意到行列式可以在交换环上定义(比如模 xn 或者模合数),但一般的高斯消元需要逆元。

如果是个欧几里得环就可以辗转相除(模合数虽然不是欧式环,但是可以先扩到整数环里面消)。

不过如果是比较一般的环,消元好像比较鬼畜(至少今年员交中的那个《从素数到合数》我是还没有看懂的)。


证明 1(该证明来自于这里):

考虑一种容斥:枚举哪些点形成环,则剩下的点随便找父亲。假如有 k 个环,环外的点集为 S,则贡献为 (1)k×iSdegi

发现这种容斥方法和置换一一对应:将置换 P 循环分解,则大小为 1 的循环对应环外的点,否则对应一个环。

那么考虑主对角线余子式,对应组合意义即选定一个点为根,剩下的点作行列式。

然后只需要证大小为 1 的循环贡献为 degi,否则贡献 (1)(注意行列式本身的定义,该循环还会贡献逆序对的符号)。

关于行列式的组合意义,还有一个叫作 LGV 引理 的东西(其实是在洛谷模板题里乱翻看到的),虽然证明思路不太一样。

另外,好像在以前还看到过某知乎老哥利用行列式组合意义反向证明了 cauchy-binet 定理的。


证明 2(我自己瞎掰的):

其实是因为之前在看拟阵时看到了这篇知乎文章,发现它所说的图拟阵的线性表出就是在常见证法中构造出来的 L=BTB

想了一下发现可以把常见证法改了改 虽然感觉本质还是一样的,从 cauchy-binet 定理出发证明。

首先是 cauchy-binet 定理:

对于 n×m 矩阵 An×m 矩阵 B,有:

det(ABT)=|s|=ndet(AsBsT)=|s|=ndet(As)det(BsT)

其中 s 是全集 {1,2,,m} 的大小为 n 的子集,As 表示从矩阵 A 中选出 s 所对应的列集合得到的 n×n 的矩阵。

特别地,当 n>mdet(AB)=0;当 n=m 变成 det(AB)=det(A)det(B)

暴力展开当然可以证,但是更优美的证法好像似乎大概可能需要范畴论的知识?总之不会证,告辞。

记点数为 n,边数为 m

考虑对于边 (x,y),构造 n 维列向量 v 满足 vi=[i=x][i=y](这里 x,y 的顺序并不重要)。则一组列向量线性无关等价于它们对应的边无环。

构造 n×m 矩阵 B=(v1,v2,vm)(此时惊讶地发现基尔霍夫矩阵 L=BBT)。

则由上可知 det(BBT)=|s|=ndet(Bs)det(BsT)=|s|=ndet2(Bs),然后发现 det2(Bs)0 等价于选出 s 对应的边集无环。

然而 |s|=n>n1,所以它必然成环,由此得到 det(BBT)=0,因此基尔霍夫矩阵行列式恒等于零。

如果我们可以让 |s|=n1,那么枚举 s 的过程其实就对应了枚举所有大小为 n1 的边集的过程,而这样就可以枚举到生成树。

考虑把所有列向量同时删去第 p 行得到一组维数为 n1 的列向量,此时它们的线性无关性依然等价于它们对应的边无环。

记新的 (n1)×m 的矩阵为 B(此时再次惊讶地发现 BBTL 删去第 p 行第 p 列的矩阵)。

det(BBT)=|s|=n1det2(Bs),此时 det2(Bs)0 就对应了一棵生成树。

只要再证明当 det2(Bs)0 时一定有 det2(Bs)=1,也即 Bs 是幺模矩阵,就能证出 matrix - tree 定理。

事实上,Bs 是非常经典的全幺模矩阵。


定理的扩展 1:

如果是有向图的树形图计数,不妨计以 r 为根的自闭内向树形图数量。

结论:只需要把无向图中的度数矩阵改成出度矩阵,求出删去第 r 行第 r 列的余子式。

内向树形图可以描述成 “除根 r 外所有点出度为 1” + “将有向边改成无向边后没有环”,如果用证明 1 的方法是类似可证的。

如果用证明 2 的方法,则需另构造一个 n×m 的矩阵 A 限制出度。设有向边 ej=ujvj,则可以构造 aij=[uj=i]

注意到 A 中的列向量集线性无关等价于所有出度 1。如果删去第 r 行,则线性无关性等价于除 r 以外的点出度 1

此时又一次惊讶地发现 L=ABTB 就是无向图中那个矩阵,不过注意此时为有向边),之后类似。

为了完成证明,仅证 As,Bs 是幺模矩阵还不够,必须证明它们同时取 1 或 -1,不过这是可以证出来的。


定理的扩展 2:

另一种扩展方向就是定义生成树的权值为边权乘积,求所有生成树权值之和。生成树计数可以认为所有边权为 1。

结论:把边权为 w 的边 “当作” 有 w 条重边(当然 w 不一定为正整数)代入 matrix-tree 定理。显然,方法 1 也可以类似可证。

方法 2 中,只需要把 B 中原本是 ±1 的地方改成 ±wi(当然这里 wi 不一定存在,就当作一个 “形式” 好了 本来想说扩域结果发现可能边权不一定在域中定义),证明最后证全幺模矩阵的地方改成证行列式为 iwi

有向图也可以这么扩展,把 B 中的 ±1 改成 ±wi


为啥要引入证明方法 2:

证明方法 2 实际上把 matrix-tree 定理中的生成树计数抽象成了 “基计数”,利用 cauthy-binet 定理去枚举所有可能为基的子集,并用行列式判断是否线性独立。

然而这有局限性,即列向量构成一组基的矩阵必须为(全)幺模矩阵,否则会出问题。

而推广到有向图的树形图计数时,条件甚至不再是一个拟阵,而是两个拟阵的交(暂时换成 “拟阵” 这个术语吧,我不知道更严谨的说法是什么)。因此某种意义上说这个定理还可以计算最大拟阵交的数量。

然而这个条件更严苛:不仅要是(全)幺模矩阵,而且两个拟阵的行列式必须同时取 ±1

有没有什么办法把这种思想推广?现在可能有些想法 不过可能以后要用,先不贴。嘛,还有很多东西没有研究清楚 下次再说吧

update in 2021/01/31:出了一道垃圾题


prüfer 序列

以前写了,虽然和 matrix-tree 关系不大,不过都可以用来数树,就再写一遍吧。

定义就不贴了,可以百度。prufer 序列与树之间的线性转化可以看这道题,还是比较巧妙的。

由于 prufer 序列和有标号树一一对应,所以随机生成一个 prufer 序列等价于随机一棵无根有标号树。

然后众所周知这种随机算法得到的树有些优美的性质,比如直径 n 虽然我并不会证

prufer 序列最好的地方在于它可以限制点的度数(点 x 的度数等于 x 在 prufer 序中的出现次数减一),举个例子(「WC2019」数树 中的一个结论):

现有 k 个大小为 a1,a2,,ak 的连通块,且 n=iai。则将 k 个连通块连成树的方案数为 nk2×i=1kai

证明:

i=1kpi=k2(k2)!i=1kpi!×i=1kaipi+1

由 prufer 序列即可写出上式。记 Fi(z)=j=0aijj!zj=eaiz,则上式又可写成 i=1kai×(k2)!×[xk2]i=1kFi(z)

代入 Fi(z)=eaiz 即可得到最终结果 nk2×i=1kai

当然用 matrix-tree 解,也解得出来。

还有一些其他应用,比如 一道基环树计数。可以理解成改变 prufer 序列的删点优先级(非环点先删,环点后删),当然也可以理解成直接把环缩成点 不过前面那种理解很有趣,就记录下来了


BEST 定理

详细内容可参考 IOI2018 论文《欧拉图相关的生成与计数问题探究 北京师范大学附属实验中学 陈通》,作为矩阵树的一个应用放这里。

冷知识:该定理由 deBruijn、vanAardenne-Ehrenfest、Smith 和 Tutte 四人提出,所以叫作 BEST 定理。

给定一个有向欧拉图(弱连通、所有点入度等于出度),记 T1 表示以 1 号点为根的内向树数量,记 di 表示第 i 个点的出度。

则从 1 号点出发(一定回到 1 号点)的欧拉路径数量 E1=T1×di!×ji(dj1)!

特别地,欧拉回路数量为 E=E1d1=T1×i(di1)!(这是因为选定 1 号点为起点时,每个欧拉回路都有 d1 种同构)。

那么只需要做有向图的内向树即可,套矩阵树定理即可。这是一道模板题。

证明:

对于一棵以 1 号点为根的内向树,从每个点出发先走非树边再走树边,指定非树边的访问顺序,这样方案数就是 T1×di!×ji(dj1)!

我们将证明这样的顺序一定可以得到一条从 1 出发的欧拉路径。事实上只需要证明每次走过一条边 uivi 并删去后仍存在欧拉路径,由于度数限制显然满足,那么只需要证仍然弱连通。

如果 uivi 是树边,则显然(这是 ui 被删的最后一条边);否则,ui 到 1 的树边一定全都存在,且 vi 到 1 的树边也全都存在,那么它们仍然弱连通。

因此任意一种方案都可以对应到一条欧拉路径。


对于一条欧拉路径,指定每个点(当然除了 1 号点)在该路径中最后一条出边为树边,其他边为非树边。

我们将证明这样规定树边是合法的(不会形成环)。如果有环,则首先它不含 1 号点(1 号点没有树边作出边)。考虑这个环的实际含义:每条环边都是该点的最后一条出边,那么这个环已经形成了一条欧拉回路,矛盾。

因此任意一条欧拉路径都可以对应一种方案,由此原定理得证。

然后是其他一些东西:

由于根的选取具有任意性,所以定理还表明在有向欧拉图中所有点的内向/外向生成树数量相同。

无向图的欧拉回路计数是 #P-complete 的,所以如果你觉得你会做,可以先去领个图灵奖。

posted @   Tiw_Air_OAO  阅读(1097)  评论(3编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示