「笔记」数树相关的一些内容
没什么干货,基本上都是瞎写,而且是想到什么写什么,所以可能你看完也学习不到什么。
由于我数学很差,所以可能会写大堆废话 + 大堆错误 + 大堆不带证明的结论。
由于我水平有限,所以写的东西比较显然,内容也十分基础入门。
本篇文章于 2020/11/26 重构。
matrix - tree 定理
先考虑无向图 :记基尔霍夫矩阵 ,其中 表示度数矩阵, 表示邻接矩阵。
则该无向图的生成树数量等于主对角线上任意元素的余子式。
然后就只需要求解行列式,高斯消元即可。
注意到行列式可以在交换环上定义(比如模 或者模合数),但一般的高斯消元需要逆元。
如果是个欧几里得环就可以辗转相除(模合数虽然不是欧式环,但是可以先扩到整数环里面消)。
不过如果是比较一般的环,消元好像比较鬼畜(至少今年员交中的那个《从素数到合数》我是还没有看懂的)。
证明 1(该证明来自于这里):
考虑一种容斥:枚举哪些点形成环,则剩下的点随便找父亲。假如有 个环,环外的点集为 ,则贡献为 。
发现这种容斥方法和置换一一对应:将置换 循环分解,则大小为 1 的循环对应环外的点,否则对应一个环。
那么考虑主对角线余子式,对应组合意义即选定一个点为根,剩下的点作行列式。
然后只需要证大小为 1 的循环贡献为 ,否则贡献 (注意行列式本身的定义,该循环还会贡献逆序对的符号)。
关于行列式的组合意义,还有一个叫作 LGV 引理 的东西
(其实是在洛谷模板题里乱翻看到的),虽然证明思路不太一样。
另外,好像在以前还看到过某知乎老哥利用行列式组合意义反向证明了 cauchy-binet 定理的。
证明 2(我自己瞎掰的):
其实是因为之前在看拟阵时看到了这篇知乎文章,发现它所说的图拟阵的线性表出就是在常见证法中构造出来的 。
想了一下发现可以把常见证法改了改
虽然感觉本质还是一样的,从 cauchy-binet 定理出发证明。
首先是 cauchy-binet 定理:
对于 矩阵 与 矩阵 ,有:
其中 是全集 的大小为 的子集, 表示从矩阵 中选出 所对应的列集合得到的 的矩阵。
特别地,当 时 ;当 变成 。
暴力展开当然可以证,但是更优美的证法
好像似乎大概可能需要范畴论的知识?总之不会证,告辞。
记点数为 ,边数为 。
考虑对于边 ,构造 维列向量 满足 (这里 的顺序并不重要)。则一组列向量线性无关等价于它们对应的边无环。
构造 矩阵 (此时
惊讶地发现基尔霍夫矩阵 )。则由上可知 ,然后发现 等价于选出 对应的边集无环。
然而 ,所以它必然成环,由此得到 ,因此基尔霍夫矩阵行列式恒等于零。
如果我们可以让 ,那么枚举 的过程其实就对应了枚举所有大小为 的边集的过程,而这样就可以枚举到生成树。
考虑把所有列向量同时删去第 行得到一组维数为 的列向量,此时它们的线性无关性依然等价于它们对应的边无环。
记新的 的矩阵为 (此时
再次惊讶地发现是 删去第 行第 列的矩阵)。则 ,此时 就对应了一棵生成树。
只要再证明当 时一定有 ,也即 是幺模矩阵,就能证出 matrix - tree 定理。
事实上, 是非常经典的全幺模矩阵。
定理的扩展 1:
如果是有向图的树形图计数,不妨计以 为根的自闭内向树形图数量。
结论:只需要把无向图中的度数矩阵改成出度矩阵,求出删去第 行第 列的余子式。
内向树形图可以描述成 “除根 外所有点出度为 1” + “将有向边改成无向边后没有环”,如果用证明 1 的方法是类似可证的。
如果用证明 2 的方法,则需另构造一个 的矩阵 限制出度。设有向边 ,则可以构造 。
注意到 中的列向量集线性无关等价于所有出度 。如果删去第 行,则线性无关性等价于除 以外的点出度 。
此时又一次惊讶地发现 ( 就是无向图中那个矩阵,不过注意此时为有向边),之后类似。
为了完成证明,仅证 是幺模矩阵还不够,必须证明它们同时取 1 或 -1,不过这是可以证出来的。
定理的扩展 2:
另一种扩展方向就是定义生成树的权值为边权乘积,求所有生成树权值之和。生成树计数可以认为所有边权为 1。
结论:把边权为 的边 “当作” 有 条重边(当然 不一定为正整数)代入 matrix-tree 定理。显然,方法 1 也可以类似可证。
方法 2 中,只需要把 中原本是 的地方改成 (当然这里 不一定存在,就当作一个 “形式” 好了 本来想说扩域结果发现可能边权不一定在域中定义),证明最后证全幺模矩阵的地方改成证行列式为 。
有向图也可以这么扩展,把 中的 改成 。
为啥要引入证明方法 2:
证明方法 2 实际上把 matrix-tree 定理中的生成树计数抽象成了 “基计数”,利用 cauthy-binet 定理去枚举所有可能为基的子集,并用行列式判断是否线性独立。
然而这有局限性,即列向量构成一组基的矩阵必须为(全)幺模矩阵,否则会出问题。
而推广到有向图的树形图计数时,条件甚至不再是一个拟阵,而是两个拟阵的交(暂时换成 “拟阵” 这个术语吧,我不知道更严谨的说法是什么)。因此某种意义上说这个定理还可以计算最大拟阵交的数量。
然而这个条件更严苛:不仅要是(全)幺模矩阵,而且两个拟阵的行列式必须同时取 。
有没有什么办法把这种思想推广?现在可能有些想法 不过可能以后要用,先不贴。嘛,还有很多东西没有研究清楚 下次再说吧。
update in 2021/01/31:出了一道垃圾题。
prüfer 序列
以前写了,虽然和 matrix-tree 关系不大,不过都可以用来数树,就再写一遍吧。
定义就不贴了,可以百度。prufer 序列与树之间的线性转化可以看这道题,还是比较巧妙的。
由于 prufer 序列和有标号树一一对应,所以随机生成一个 prufer 序列等价于随机一棵无根有标号树。
然后
众所周知这种随机算法得到的树有些优美的性质,比如直径虽然我并不会证。
prufer 序列最好的地方在于它可以限制点的度数(点 的度数等于 在 prufer 序中的出现次数减一),举个例子(「WC2019」数树 中的一个结论):
现有 个大小为 的连通块,且 。则将 个连通块连成树的方案数为 。
证明:
由 prufer 序列即可写出上式。记 ,则上式又可写成 。
代入 即可得到最终结果 。
当然用 matrix-tree 解,也解得出来。
还有一些其他应用,比如 一道基环树计数。可以理解成改变 prufer 序列的删点优先级(非环点先删,环点后删),当然也可以理解成直接把环缩成点 不过前面那种理解很有趣,就记录下来了。
BEST 定理
详细内容可参考 IOI2018 论文《欧拉图相关的生成与计数问题探究 北京师范大学附属实验中学 陈通》,作为矩阵树的一个应用放这里。
冷知识:该定理由 deBruijn、vanAardenne-Ehrenfest、Smith 和 Tutte 四人提出,所以叫作 BEST 定理。
给定一个有向欧拉图(弱连通、所有点入度等于出度),记 表示以 1 号点为根的内向树数量,记 表示第 个点的出度。
则从 1 号点出发(一定回到 1 号点)的欧拉路径数量 。
特别地,欧拉回路数量为 (这是因为选定 1 号点为起点时,每个欧拉回路都有 种同构)。
那么只需要做有向图的内向树即可,套矩阵树定理即可。这是一道模板题。
证明:
对于一棵以 1 号点为根的内向树,从每个点出发先走非树边再走树边,指定非树边的访问顺序,这样方案数就是 。
我们将证明这样的顺序一定可以得到一条从 1 出发的欧拉路径。事实上只需要证明每次走过一条边 并删去后仍存在欧拉路径,由于度数限制显然满足,那么只需要证仍然弱连通。
如果 是树边,则显然(这是 被删的最后一条边);否则, 到 1 的树边一定全都存在,且 到 1 的树边也全都存在,那么它们仍然弱连通。
因此任意一种方案都可以对应到一条欧拉路径。
对于一条欧拉路径,指定每个点(当然除了 1 号点)在该路径中最后一条出边为树边,其他边为非树边。
我们将证明这样规定树边是合法的(不会形成环)。如果有环,则首先它不含 1 号点(1 号点没有树边作出边)。考虑这个环的实际含义:每条环边都是该点的最后一条出边,那么这个环已经形成了一条欧拉回路,矛盾。
因此任意一条欧拉路径都可以对应一种方案,由此原定理得证。
然后是其他一些东西:
由于根的选取具有任意性,所以定理还表明在有向欧拉图中所有点的内向/外向生成树数量相同。
无向图的欧拉回路计数是 #P-complete 的,所以如果你觉得你会做,可以先去领个图灵奖。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现