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

前置知识:矩阵行列式

矩阵树定理

矩阵树定理说的大概就是这样一件事:对于一张无向图 \(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】智商锁

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

矩阵树定理&BEST定理学习笔记的更多相关文章

  1. 左偏树 / 非旋转treap学习笔记

    背景 非旋转treap真的好久没有用过了... 左偏树由于之前学的时候没有写学习笔记, 学得也并不牢固. 所以打算写这么一篇学习笔记, 讲讲左偏树和非旋转treap. 左偏树 定义 左偏树(Lefti ...

  2. 矩阵树定理(Matrix Tree)学习笔记

    如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/64 ...

  3. 「中国剩余定理CRT」学习笔记

    设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...

  4. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

  5. 【AC自动机】【字符串】【字典树】AC自动机 学习笔记

    blog:www.wjyyy.top     AC自动机是一种毒瘤的方便的多模式串匹配算法.基于字典树,用到了类似KMP的思维.     AC自动机与KMP不同的是,AC自动机可以同时匹配多个模式串, ...

  6. 【动态树问题】LCT学习笔记

    我居然还不会LCT QAQ真是太弱了 必须学LCT QAQ ------------------线割分是我www------------ LinkCut-Tree是基于Splay(由于Splay能够非 ...

  7. 树链剖分 树剖求lca 学习笔记

    树链剖分 顾名思义,就是把一课时分成若干条链,使得它可以用数据结构(例如线段树)来维护 一些定义: 重儿子:子树最大的儿子 轻儿子:除了重儿子以外的儿子 重边:父节点与重儿子组成的边 轻边:除重边以外 ...

  8. 伸展树(Splay)学习笔记

    二叉排序树能够支持多种动态集合操作,它可以被用来表示有序集合,建立索引或优先队列等.因此,在信息学竞赛中,二叉排序树应用非常广泛. 作用于二叉排序树上的基本操作,其时间复杂度均与树的高度成正比,对于一 ...

  9. 【python】numpy库和matplotlib库学习笔记

    Numpy库 numpy:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成,并可与C++/Fortran语言无缝结合.树莓派Python v3默 ...

随机推荐

  1. struts2漏洞复现分析合集

    struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...

  2. Visual Studio Debug only user code with Just My Code

    Debug only user code with Just My Code By default, the debugger skips over non-user code (if you wan ...

  3. Mybatis初始化机制

    对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置 ...

  4. css3鼠标悬停图片边框线条动画特效

    css3鼠标经过内容区时,边框线条特效效果制作.   html: <div class="strength grWidth hidden"> <div class ...

  5. Java中的函数式编程(五)Java集合框架中的高阶函数

    写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程.   本文的 ...

  6. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  7. Servlet学习一(Servlet的使用流程)

    一.servlet运行流程 运行流程:浏览器发送请求到服务器,服务器根据url地址在webapps中寻找对应的项目文件夹然后再web.xml中检索对应的servlet,并进行调用二.servlet类写 ...

  8. 什么是产品待办列表?(What is Product Backlog)

    正如scrum指南中所描述的,产品待办事项列表是一个紧急而有序的列表,其中列出了改进产品所需的内容.它是scrum团队承担的工作的唯一来源. 在sprint计划 (Sprint Planning)活动 ...

  9. 改善深层神经网络-week1编程题(Regularization)

    Regularization Deep Learning models have so much flexibility and capacity that overfitting can be a ...

  10. 机器学习:SVM

    SVM 前言:支持向量机(Support Vector Machine, SVM),作为最富盛名的机器学习算法之一,其本身是一个二元分类算法,为了更好的了解SVM,首先需要一些前提知识,例如:梯度下降 ...