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


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

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

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

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


matrix - tree 定理

先考虑无向图 \(G\):记基尔霍夫矩阵 \(L_G = D_G - A_G\),其中 \(D_G\) 表示度数矩阵,\(A_G\) 表示邻接矩阵。

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

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

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

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

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


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

考虑一种容斥:枚举哪些点形成环,则剩下的点随便找父亲。假如有 \(k\) 个环,环外的点集为 \(S\),则贡献为 \((-1)^{k}\times \prod_{i\in S} deg_i\)

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

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

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

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

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


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

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

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

首先是 cauchy-binet 定理:

对于 \(n\times m\) 矩阵 \(A\)\(n\times m\) 矩阵 \(B\),有:

\[\det(AB^T)=\sum_{|s|=n}\det(A_{s*}B_{s*}^T)=\sum_{|s|=n}\det(A_{s*})\det(B_{s*}^T) \]

其中 \(s\) 是全集 \(\{1,2,\dots,m\}\) 的大小为 \(n\) 的子集,\(A_{s*}\) 表示从矩阵 \(A\) 中选出 \(s\) 所对应的列集合得到的 \(n\times n\) 的矩阵。

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

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

记点数为 \(n\),边数为 \(m\)

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

构造 \(n \times m\) 矩阵 \(B = (\vec{v_1},\vec{v_2},\dots \vec{v_m})\)(此时惊讶地发现基尔霍夫矩阵 \(L = BB^T\))。

则由上可知 \(\det(BB^T)=\sum_{|s|=n}\det(B_{s*})\det(B_{s*}^T)=\sum_{|s|=n}\det^2(B_{s*})\),然后发现 \(\det^2(B_{s*})\neq 0\) 等价于选出 \(s\) 对应的边集无环。

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

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

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

记新的 \((n-1)\times m\) 的矩阵为 \(B'\)(此时再次惊讶地发现 \(B'B'^T\)\(L\) 删去第 \(p\) 行第 \(p\) 列的矩阵)。

\(\det(B'B'^T)=\sum_{|s|=n-1}\det^2(B'_{s*})\),此时 \(\det^2(B'_{s*})\neq 0\) 就对应了一棵生成树。

只要再证明当 \(\det^2(B'_{s*})\neq 0\) 时一定有 \(\det^2(B'_{s*}) = 1\),也即 \(B'_{s*}\) 是幺模矩阵,就能证出 matrix - tree 定理。

事实上,\(B'_{s*}\) 是非常经典的全幺模矩阵。


定理的扩展 1:

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

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

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

如果用证明 2 的方法,则需另构造一个 \(n\times m\) 的矩阵 \(A\) 限制出度。设有向边 \(e_j=u_j\to v_j\),则可以构造 \(a_{ij}=[u_j=i]\)

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

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

为了完成证明,仅证 \(A_{s*},B_{s*}\) 是幺模矩阵还不够,必须证明它们同时取 1 或 -1,不过这是可以证出来的。


定理的扩展 2:

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

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

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

有向图也可以这么扩展,把 \(B\) 中的 \(\pm 1\) 改成 \(\pm w_i\)


为啥要引入证明方法 2:

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

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

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

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

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

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


prüfer 序列

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

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

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

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

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

现有 \(k\) 个大小为 \(a_1,a_2,\dots,a_k\) 的连通块,且 \(n=\sum_i a_i\)。则将 \(k\) 个连通块连成树的方案数为 \(n^{k-2}\times \prod_{i=1}^k a_i\)

证明:

\[\sum_{\sum_{i=1}^{k}p_i=k-2}\frac{(k-2)!}{\prod_{i=1}^kp_i!}\times \prod_{i=1}^{k}a_i^{p_i+1} \]

由 prufer 序列即可写出上式。记 \(F_i(z) = \sum_{j=0}\frac{a_i^j}{j!}z^j = e^{a_iz}\),则上式又可写成 \(\prod_{i=1}^{k}a_i\times (k-2)!\times [x^{k-2}]\prod_{i=1}^{k} F_i(z)\)

代入 \(F_i(z) = e^{a_iz}\) 即可得到最终结果 \(n^{k-2}\times \prod_{i=1}^k a_i\)

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

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


BEST 定理

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

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

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

则从 1 号点出发(一定回到 1 号点)的欧拉路径数量 \(E_1 = T_1\times d_i!\times \prod_{j\neq i}(d_j-1)!\)

特别地,欧拉回路数量为 \(E = \frac{E_1}{d_1} = T_1\times \prod_{i}(d_i-1)!\)(这是因为选定 1 号点为起点时,每个欧拉回路都有 \(d_1\) 种同构)。

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

证明:

对于一棵以 1 号点为根的内向树,从每个点出发先走非树边再走树边,指定非树边的访问顺序,这样方案数就是 $ T_1\times d_i!\times \prod_{j\neq i}(d_j-1)!$。

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

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

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


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

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

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

然后是其他一些东西:

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

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

posted @ 2019-01-17 12:32  Tiw_Air_OAO  阅读(1064)  评论(3编辑  收藏  举报