矩阵树定理 BEST 定理

矩阵树定理 BEST 定理

矩阵树定理

证明很复杂,连 cmd 这种无敌神犇都不会,而且对定理本身的可扩展性几乎为 0,即每次套用的定理都跟模板一模一样。

对于无向无权图,设 A 为邻接矩阵,D 为度数矩阵,定义基尔霍夫矩阵为 K=DA,那么生成树个数为去掉任意的第 k 列第 k 行的余子式。

对于有向图,设 A 为邻接矩阵,Din/Dout 为入度/出度矩阵,同样定于 Kin/Kout=Din/DoutA

k 为根的外向树个数为 Kin 去掉第 k 行第 k 列的余子式。

k 为根的内向树个数为 Kout 去掉第 k 行第 k 列的余子式。

加权扩展,如果每个点带权的话那么的是所有生成树边权乘积的和。

即求的是:

TeTwe

此时邻接矩阵的值为边权,度数矩阵为边权和。

对于矩阵数的一个小优化:因为最终的答案一定不可能是负数,所以算行列式的时候可以不用记录当前值的正负号。

P6178 【模板】Matrix-Tree 定理

模板。

P4336 [SHOI2016] 黑暗前的幻想乡

发现每个公司恰好搞一条边有点烦,还是转容斥。

f(S) 表示钦定集合 S 内的元素不能搞边的方案数。

那么有:

ans=S(1)n|S|f(S)

P3317 [SDOI2014] 重建

本题求的是:

ans=T(eTweeT(1we))=T(eTwee(1we)eT(1we))=e(1we)(TeTwe1we)

为了防止分母为 0,需要扰动一下。

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

先煎蛋地化简下式子

ans=T(i=1n1wei)×gcd(we1,we,2,,wen1)=Ti=1n1weid|gcd(we1,we2,,wen1)φ(d)=d=1max(we1,we,2,,wen1)φ(d)T[d|gcd(we1,we2,,wen1)](i=1n1wei)

发现内层求的是所有生成树的边权和的和,这与我们能干的求所有生成树的边权积的和。

那么这里有两种常见手法,一种是取对数/exp 将乘法与加法相互转换,还有一种也就是这道题的方法。

考虑把边权变为 (1+wix),那么最终我们只需要求得最后的一次项系数即可。

那么就需要重新定义加建乘除

设当前两个多项式分别为 a+bxc+dx

加法减法就是对应项加减。

乘法即为:(a+bx)(c+dx)=ac+(ad+bc)x

除法:a+bxc+dx

考虑先手动将 c+dx 求逆变乘法。

(c+dx)(e+fx)=1(mod  x2)

带入 x=0 以及 x=1 得到:

{ce=1ce+cf+de=1{e=1cf=dc2

那么:

a+bxc+dx=(a+bc)(1cdc2x)=ac+bcadc2x

直接做为 O(n3V)V 为值域,有点爆。

优化:注意到只有当可选边个数大于等于 n1 的所有 d 求行列式即可。

P5296 [北京省选集训2019] 生成树计数

发现求的是 k 次方和,比上面那个更加复杂。

依葫芦画瓢,将边权设为 (1+x++xk)

但是在重新定义乘法的时候不太对,假设前一个多项式为 A0,A1,Ak,后一个为 B0,B1,,Bk

乘法的时候为:

Ci=j=0i(ij)AjBij

这与正常的卷积不太一样,把组合数打开:

Cii!=j=0iAjj!×Bij(ij)!

那我们只需要把初始的比设置成

i=0kwii!xi

再推一下暴力多项式求逆的方法:

j=0iAjBij=[i=0]

求逆相当于是给定一个 A,求 B

j=1ifjgij=f0gj

那么有:

Bi={1A0i=01A0j=1iAjBiji>0

最后再套上矩阵树即可。

P4208 [JSOI2008] 最小生成树计数

首先注意到无论怎么变换顺序,最终边权形成的集合一定相等。

那么考虑先对求出每种权值出现了多少次,然后对于每种权值,加入

所有不是这种权值的树边,然后并查集缩点,加入所有这种权值的边跑矩阵树求出方案数。

最终答案为每种权值得到的答案的乘积。

【UR #6】智商锁

鲜花:我还做这道题前也想到了同样的idea,蛤蛤蛤。

首先把 k=0 的情况判掉。

一种朴素的想法是直接随机一个图然后看看它的生成树个数是否恰好为 k ,每次成功的概率为 1998244353,没救。

注意到对于一个图,答案为每个边双连通分量的生成树的个数乘积,原因是割边必须选。

那你考虑将图分为 4 个部分,每个部分 25 个点,然后随机 100025 个点的图跑矩阵树,那么只要存在四个图 A,B,C,Df(S) 为图 S 的生成树个数。

那么只要存在 f(A)f(B)f(C)f(D)k(mod998244353) 即可。

f(S) 是随机生成,可以近似为一个随机数,那么可以近似为产生 10004 个随机数,那么极大概率能找到一个特定的 k

f(A)f(B) 这种成对的值放入 map 内,每次遍历每个值,看看 kf(A)f(B) 是否存在即可。

最后把找到的 4 个图 A,B,C,D 顺次排布,然后 (A,B),(B,C),(C,D) 分别连一条边即可。

BEST 定理

说的是对于一个有向 欧拉图 ,记第 i 个点的出度为 outi ,其本质不同欧拉回路个数为:

Ti=1n(outi1)!

T 为任意一个点为根内向树个数。(u 群有大佬证明说任意一个点为根的答案全相等)

注意一定是有向的欧拉图。

要使用定理前一定要判断是否为欧拉图。

注意:这里把循环同构的欧拉回路只计算了一遍,如果从第 i 个点为起点和终点的欧拉回路数量还需要乘以 outi

P5807 【模板】BEST 定理 | Which Dreamed It

板子题,直接做就好了。

[AGC051D] C4

注意到这是无向图,考虑枚举 12,23,34,41 分别的个数为 a,b,c,d,那么反过来的个数为 Aa,Bb,Cc,Dd,大写字母表示无向图时的边权。

此时复杂度爆了,但是你注意到最终一定要是欧拉图,也就是出入都要平衡,那么只要确定了 a 那所有的都确定了。

确定了每条边的个数后直接跑欧拉回路板子即可。

注意到本体同起点同终点的边不做区分,那么最后要乘以 1a!b!c!d!(Aa)!(Bb)!(Cc)!(Dd)!

复杂度 O(A)

扩展:求无向图的欧拉回路数量?

别想了哥们,这是 NPC

P7531 [USACO21OPEN] Routing Schemes P

注意到每条边需要恰好出现一次,这与欧拉回路的定义很像。

考虑转化,建立一个源点和汇点,每次源点连向所有起点,所有终点连向汇点,然后汇点向源点连 n 条边,n 为起点终点个数。

然后答案为以源点为根的欧拉回路个数,但是汇点和源点连出去的边是不区分,最后还需除以 outS!outT!

posted @   Hanghang007  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示