矩阵树定理&BEST定理学习笔记

终于学到这个了,本来准备省选前学来着的?

前置知识:矩阵行列式

矩阵树定理

矩阵树定理说的大概就是这样一件事:对于一张无向图 \(G\),我们记 \(D\) 为其度数矩阵,满足 \(D_{i,i}=\text{点}i\text{的度数}\)\(D_{i,j}=0(i\ne j)\),再记 \(A\) 为其邻接矩阵,满足 \(A_{i,j}=i,j\text{之间边的条数}\),如果有重边则算作多条边。

\(K=D-A\),那么去掉 \(K\)\(k\) 行第 \(k\) 列(\(k\) 任意)得到的矩阵 \(k'\) 的行列式就是 \(G\) 中生成树的个数。

这样的矩阵 \(K\) 又被称为 \(G\) 的基尔霍夫矩阵,注意到这里的 \(k\) 可以取任意值,也就是说去掉任意第 \(k\) 行第 \(k\) 列后得到矩阵的行列式都是相同的(\(n-1\) 阶主子式)

证明鸽掉了,因为 cmd_blk 也不会,所以就只能靠记忆力咯

矩阵树定理可以扩展到带权值的情况,即求图 \(G\) 所有生成树权值之积的和,但是这样度数矩阵和临界矩阵的定义就要发生变化了,重新定义度数矩阵为 \(D_{i,i}=\text{所有与}i\text{相连的边的权值之和},D_{i,j}=0(i\ne j)\), 邻接矩阵 \(A_{i,j}=i,j\text{之间边的权值之和}\),剩余部分都和不带权的情况相同了。

矩阵树定理也可以扩展到有向图的情况,不过有向图的生成树就要与无向图加以区分了,有向图的生成树可以分为两种,叶向树和根向树,两类生成树都要指定一个根节点 \(r\),其中叶向树满足从根开始 DFS 整棵树,经过的所有边都指向其儿子;根向树满足从根开始 DFS 整棵树,经过的所有边都指向其父亲。

那么以某个点 \(r\) 为根的叶向树和根向树的个数怎么求呢?我们记 \(D^{\text{in}}\) 为入度矩阵,\(D^{\text{in}}_{i,i}=i\text{的入度},D^{\text{in}}_{i,j}=0(i\ne j)\),类似地定义了 \(D^{\text{out}}\)。记 \(A_{i,j}=i,j\text{之间边的条数}\),再记 \(K^{\text{in}}=D^{\text{in}}-A\)\(K^{\text{out}}=D^{\text{out}}-A\),那么:

  • \(r\) 为根的叶向树个数即为 \(K^{\text{in}}\) 去掉第 \(r\) 行第 \(r\) 列后的行列式
  • \(r\) 为根的根向树个数即为 \(K^{\text{out}}\) 去掉第 \(r\) 行第 \(r\) 列后的行列式

BEST 定理

BEST 定理说的是这样一件事:对于一个欧拉图(有向图)而言,其以 \(x\) 出发,\(x\) 结束的欧拉回路的个数为 \(C\times deg_x\prod\limits_{u\in V}(deg_u-1)!\),其中 \(C\) 为以 \(x\) 为根的根向树(叶向树也没问题,因为反正是欧拉图,每个点入度等于出度)的个数。

为什么呢?首先我们考虑图的任意一棵根向树,对于再每个节点我们将以 \(u\) 为起点的所有不在根向树上的 \(deg_u-1\) 条出边(当然如果 \(u\) 为根节点就有 \(deg_u\) 条不在根向树上的出边)钦定一个顺序,方便起见我们称这个根向树及这个出边的排列顺序为一个“组合”,显然证明原命题我们只需证明一下两个部分:

  • 每个组合唯一对应一条欧拉回路
  • 每条欧拉回路唯一对应一个组合

先考虑第一个命题,我们考虑这样一个走法:从根节点开始,每到达一个节点,如果除了该节点与其在根向树上与父亲相连的边,其余边都被走过了,那么就沿着根向树上的边走向其父亲,否则就按照钦定的顺序走向下一条边。

显然这样每条边最多被访问一次,不过为什么这样走总可以得到一个欧拉回路呢?会不会走到一个地方走不下去了呢?

考虑反证法,假设走到某个点 \(u\) 之后走不下去了,如果 \(u\) 不是根节点,那么显然我们每次经过 \(u\) 都会经过它的一条入边和一条出边,而这次访问 \(u\) 只访问了 \(u\) 的一条入边,也就是说 \(u\) 的入边个数等于出边个数 \(+1\),与原图为欧拉图矛盾。如果 \(u\) 是根节点并且到达 \(u\) 的时候没有访问完全部边,那么必然 \(\exists\) 某条根向树上的边 \(e=(x,fa[x])\) 没有被访问,这样一来 \((fa[x],fa[fa[x]]),(fa[fa[x]],fa[fa[fa[x]]]),\cdots\) 也都不会被访问,也就是说根节点存在一条入边被访问,根据原图为欧拉图知 \(u\) 必然有一条出边没有被访问,矛盾!

因此每个组合唯一对应一条欧拉回路。

再考虑第二个命题,我们记 \(e_u\)\(u\) 最后访问的入边,下证所有 \(e_u\) 构成一棵根向树,还是采用反证法,如果有环,那么根节点必然不会在环上,而由于换上的某个点 \(x\) 走一圈之后还能回到 \(x\),根据原图是欧拉图,\(x\) 的入度等于出度,即访问完 \(e_x\)\(x\) 经过的入边条数等于出边条数,而绕一圈又回到了 \(x\),又对 \(x\) 经过的入边条数产生 \(1\) 的贡献,故 \(x\) 的入度等于出度 \(+1\),矛盾!

故原命题成立。

关于欧拉回路计数还有一个注意点,就是如果题目要求“经过所有边恰好一次”,那么孤立点是需要排除在外的,注意特判这一点。

例题:

1. P4111 [HEOI2015]小 Z 的房间

模板到不能再模板的题,直接在相邻点之间连边后跑矩阵树定理即可。

时间复杂度 \(n^3m^3\)

2. P4455 [CQOI2018]社交网络

Yet another 模板到不能再模板的题,连边后套用矩阵树定理求出叶向生成树个数即可。

时间复杂度 \(n^3\)

3. P4336 [SHOI2016]黑暗前的幻想乡

考虑容斥原理,我们先一遍矩阵树定理求出所有由题目中给出的所有边构成的生成树个数,再减去由 \(n-2\) 个公司的边能够构成的生成树个数,再加上由 \(n-3\) 个公司的边能够构成的生成树个数,以此类推即可求出最终的答案,复杂度 \(2^{n-1}(n-1)^3\)

4. P3317 [SDOI2014]重建

显然,对于一棵生成树 \(T\)\(T\) 中的边恰好连通的概率为 \(\prod\limits_{e\in T}p_e\prod\limits_{e\notin T}(1-p_e)\),因此题目要求的答案即为 \(\sum\limits_{T}\prod\limits_{e\in T}p_e\prod\limits_{e\notin T}(1-p_e)\),发现这个不太好直接求。注意到后边的贡献都是 \(1-p_e\),因此考虑提一个 \(1-p_e\) 出来,那么式子就会变成 \(\prod\limits_{e}(1-p_e)\sum\limits_{T}\prod\limits_{e\in T}\dfrac{p_e}{1-p_e}\),这样就可以矩阵树定理求了。还有一个注意点,就是如果 \(p_e=1\),那么 \(\dfrac{p_e}{1-p_e}\) 是没有意义的,这里有一个简单的解决办法,就是对于每个 \(p_e\) 我们手动加上 \(\epsilon\),这样就不会出现分母为 \(0\) 的问题了。

5. P6624 [省选联考 2020 A 卷] 作业题

题解

6. P7531 [USACO21OPEN] Routing Schemes P

就这?也能放到 USACO Pt T2?

首先考虑怎样判断有无解,这显然是个网络流问题,对于每个 Sender 连一条源点到该点,容量为 1 的边,对于每个 Receiver 连一条该点到汇点,容量为 1 的边,对于原图中每条边连上下界均为 1 的边,然后跑网络流即可。

不过我们细想其实不需要网络流,注意到题目中有一个条件叫“每条边经过恰好一次”,看到这个条件我们很自然地想到欧拉回路,而又由于每个 Sender 都要发出消息,因此所有源点连出的、与汇点相连的边都要被经过恰好一次,但显然这个图不存在欧拉回路,因为源点的入度为 \(0\),因此考虑再从汇点向源点连 \(s\) 条边,然后判断是否存在欧拉回路即可,其中 \(s\) 为 Sender 的个数,正确性显然。

接下来考虑怎样统计方案数,这显然可以转化为一个欧拉回路计数问题,考虑 BEST 定理,我们定根为源点 \(S\) 用矩阵树定理求出根向生成树的个数 \(C\),那么整张图欧拉回路的个数就是 \(deg_S\times C\times\prod(deg_i-1)!\),但显然这并不是合法的方案数个数,因为所有与 \(S\) 相连的边的访问顺序是不重要的,所有与 \(T\) 相连的边的访问顺序也是不重要的,因此需除以 \((s!)^2\),而 \(deg_S=deg_T=s\)\(S\) 的贡献为 \((s-1)!\times s=s!\)\(T\) 的贡献为 \((s-1)!\),除掉两个 \(s!\) 就等价于将 \(S,T\) 的贡献都抵消掉再除以 \(s\)

因此方案数就是 \(C\times\dfrac{1}{s}\prod\limits_{i=1}^n(deg_i-1)!\)

注意特判孤立点!

所以这个 \(k\le 2\) 是来干嘛的……

7. CF578F Mirror Box

u1s1 这题数据很水,不少 AC 代码都可以被下面这组数据卡掉:

2 2 5
/\
\/

正确答案,包括 dreamoon 的标算输出的都是 \(0\),不过不少 AC 代码都输出 \(1\),所以强烈谴责出题人用脚造数据的行为

首先我们考虑建立一个 \((n+1)\times(m+1)\) 的点阵,如果第 \(i\) 行第 \(j\) 列放了一个'/'型的镜子那么我们就在第 \(i\) 行第 \(j+1\) 列表示的点与第 \(i+1\) 行第 \(j\) 列表示的点之间连无向边,否则我们就在第 \(i\) 行与第 \(j\) 列表示的点与第 \(i+1\)\(j+1\) 列表示的点之间连无向边,那么显然连出的图是一个 \((n+1)(m+1)\) 个点 \(nm\) 条边的无向图,其中可能会存在孤立点与环。

那么这里有一个性质,就是这些点符合要求当且仅当对于黑白染色后的图,白点构成一棵生成树或者黑点构成一棵生成树。

证明的话我翻了 \(2147483647\)(bushi)篇题解都没能给出让我满意证明,包括官方题解这一步都写得异常简略,因此这里就给出我的感性证明:大概就是,如果某种颜色的点构成的导出子图存在环,那么对于环中的边显然不可能被至少一条光线照到,而显然这些点肯定会把一个另一种颜色的点包围,因此另一种颜色的边也形成不了生成树,不符合条件;而如果两种颜色的点的导出子图都不连通,那么就存在一个边界段满足光从该边界段射入后不能从相邻边界段射出了,因此一种排列方式符合条件当且仅当存在一种颜色的点构成一棵生成树。

yysy 以上一段内容全在瞎扯,大概看看就好了

接下来考虑怎样注意,注意到这题涉及生成树计数,而 \(k\le 200\),因此想到矩阵树定理,注意到一个性质,就是如果一种颜色的点连成了一棵生成树,那么显然原图中的点集会被其隔成若干块,另一种颜色的点也就不会形成连通块了,因此只用对黑点白点分别考虑其形成生成树的情况把它们加起来即可,这个就直接缩点+Matrix-tree 即可,时间复杂度 \(k^3\)

然后就是我要强调的地方了,如果一种颜色的边已经形成了环,那么就不可能再构成生成树了,不少解法没有特判这一点,具体 hack 见上方。

8. P4208 [JSOI2008]最小生成树计数

考虑 MST 的以下两个性质:

  1. 对于所有 MST 都有每种权值的边出现次数相同
  2. 对于所有 MST 的每一个边权 \(v\),加入边权为 \(v\) 的边后连通块的状态都是一样的。

证明参见 Kruskal 的过程。

这样一来我们可以考虑这样一个过程:先用 Kruskal 求出原图的一个 MST \(T\),然后我们枚举原图 MST 上的每一个边权 \(w\),求出有多少种选出生成树上边的方法,满足其形成的连通块状态与 \(T\) 中边权为 \(w\) 的边构成的导出子图相同。这个怎么求呢?我们考虑将 \(T\) 中所有边权不为 \(w\) 的边组成的连通块,将这些连通块全都缩成一个点,记原图上的点 \(u\) 缩点后的连通块为 \(bel_i\),那么这个选边的过程就等价于在缩点后的图中有若干条形如 \(bel_{u_i},bel_{v_i}\) 的边,求它们连成一个连通块的方案数,这就可以 Matrix-Tree 了,随便搞一下即可。

时间复杂度 \(nk^3\),其中 \(k_{\max}=10\)

9. UOJ 75 【UR #6】智商锁

神仙题 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%,题解

posted @ 2021-05-11 20:09  tzc_wk  阅读(1082)  评论(0编辑  收藏  举报