生成树计数

矩阵树(Matrix-Tree)定理

假设有无向图 G ( V , E ) G(V,E) G(V,E)
D D D G ( V , E ) G(V,E) G(V,E) 的度数矩阵, D i D_i Di 表示结点 i i i 的度数,显然这是一个对角矩阵
A A A G ( V , E ) G(V,E) G(V,E) 的邻接矩阵, A i , j A_{i,j} Ai,j 表示结点 i , j i,j i,j 间的边数

Laplace矩阵 L L L 表示为 K = D − A K=D-A K=DA

去掉 L L L 的任意一行一列吗,留下一个子矩阵

然后这个行列式的值就是在这个图中**生成树的数量 **

d e t ( L ) = ∑ P ( ( − 1 ) τ ( P ) × L 1 , p 1 × L 2 , p 2 × L 3 , p 3 × ⋯ × L N , p N ) det(L)=\sum P((−1)^{\tau(P)}\times L_{1,p1}\times L_{2,p2}\times L_{3,p3}\times ⋯\times L_{N,pN}) det(L)=P((1)τ(P)×L1,p1×L2,p2×L3,p3××LN,pN)

P P P 是一个排列, τ ( P ) \tau(P) τ(P) 是逆序对个数

矩阵行列式有一个性质:

如果把矩阵的某一行(列)加上另一行(列)的k倍,则行列式的值不变。

所以把矩阵消为一个上三角矩阵后,然后求出对角线的积,便是该矩阵的行列式的值。

BEST 定理

G G G 是有向欧拉图,那么 G G G 不同欧拉回路可以这么构造

指定一个点为根节点,取一颗根向树,然后给对于每一个节点,给他连出去的非树边编一个顺序,要求根节点的第一条边要编号最小。然后从根节点出发,按顺序走非树边,没有非树边就走树边。可以证明最后能走回根节点,且所有的边都遍历到了。

所以欧拉回路总数是 根向生成树的个数 × ∏ v ∈ V ( d e g v − 1 ) ! \text{根向生成树的个数}\times \prod_{v\in V} (deg_v-1)! 根向生成树的个数×vV(degv1)! d e g deg deg 是出度。

记不同欧拉回路总数为 e c ( G ) ec(G) ec(G)
e s ( G ) = t r o o t ( G , k ) × ∏ v ∈ V ( d e g v − 1 ) ! es(G)=t^{root}(G,k)\times \prod_{v\in V}(deg_v-1)! es(G)=troot(G,k)×vV(degv1)!

树(图)的计数的多项式算法

小朋友与二叉树

我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树。
考虑一个含有n个互异正整数的序列c[1],c[2],…,c[n]。如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合{c[1],c[2],…,c[n]}中,我们的小朋友就会将其称作神犇的。并且他认为,一棵带点权的树的权值,是其所有顶点权值的总和。
给出一个整数m,你能对于任意的s(1<=s<=m)计算出权值为s的神犇二叉树的个数吗?请参照样例以更好的理解什么样的两棵二叉树会被视为不同的。
我们只需要知道答案关于998244353(7×17×2^23+1,一个质数)取模后的值。

G ( x ) = ∑ n ≥ 0 [ n ∈ C ] x n G(x)=\sum_{n\ge0}[n\in C]x^n G(x)=n0[nC]xn ,合法二叉树对应的生成函数为 F ( x ) F(x) F(x)

根据题意
F ( x ) = F 2 ( x ) G ( x ) + 1 G ( x ) F 2 ( x ) − F ( x ) + 1 = 0 F ( x ) = 1 ± 1 − 4 G ( x ) 2 G ( x ) F ( x ) = 2 1 ± 1 − 4 G ( x ) F(x)=F^2(x)G(x)+1 \\ G(x)F^2(x)-F(x)+1=0\\ F(x)=\frac{1\pm\sqrt{1-4G(x)}}{2G(x)}\\ F(x)=\frac{2}{1\pm\sqrt{1-4G(x)}}\\ F(x)=F2(x)G(x)+1G(x)F2(x)F(x)+1=0F(x)=2G(x)1±14G(x) F(x)=1±14G(x) 2
分母常数项不能为 0 0 0 ,所以
F ( x ) = 2 1 + 1 − 4 G ( x ) F(x)=\frac{2}{1+\sqrt{1-4G(x)}}\\ F(x)=1+14G(x) 2
调用多项式求逆和多项式开根计算即可,时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

大朋友与多叉树

求满足如下条件的多叉树个数:
1.每一个点的儿子个数在给定的集合 S S S
2.总的叶子节点树为 s s s

儿子之间有顺序关系,但节点是没有标号的。

F ( x ) F(x) F(x) 是生成一颗含 i i i 个叶节点的合法树的个数的生成函数。

那么
F ( x ) = x + ∑ i ∈ S F i ( x ) F(x)=x+\sum_{i\in S} F^i(x) F(x)=x+iSFi(x)
G ( x ) = x − ∑ i ∈ S x i G(x)=x-\sum_{i\in S}x^i G(x)=xiSxi 。那么
G ( F ( x ) ) = x G(F(x))=x G(F(x))=x
使用拉格朗日反演求复合逆即可,时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

YJC plays Minecraft

给出若干个完全图,然后完全图之间首尾相连并成环,要求删边使得两点之间路径数不超过 1 1 1 ,求方案数。

f n f_n fn 表示 n n n 个节点完全图的生成树个数, g n g_n gn 表示 n n n 个节点完全图的生成森林个数, h n h_n hn 表示 n n n 个节点完全图,点 1 1 1 和点 n n n 不在一棵树中的生成森林个数。 F ( x ) , G ( x ) , H ( x ) F(x),G(x),H(x) F(x),G(x),H(x) 是对应的生成函数。

答案就是 2 n ∏ i = 1 n g a i − ∏ i = 1 n ( g a i − h a i ) 2^n\prod_{i=1}^ng_{a_i}-\prod_{i=1}^n(g_{a_i}-h_{a_i}) 2ni=1ngaii=1n(gaihai)

已知 F ( x ) = ∑ i i − 2 i ! x i F(x)=\sum\frac{i^{i-2}}{i!}x^i F(x)=i!ii2xi G ( x ) = ∑ F i ( x ) x ! = e F ( x ) G(x)=\sum\frac{F^i(x)}{x!}=e^{F(x)} G(x)=x!Fi(x)=eF(x)

考虑 H ( x ) H(x) H(x) ,枚举 1 1 1 号节点所在块的大小可得 h n = ∑ i = 0 n − 2 f i + 1 g n − i − 1 ( n − 2 i ) h_n=\sum_{i=0}^{n-2}f_{i+1}g_{n-i-1}{n-2 \choose i} hn=i=0n2fi+1gni1(in2)

生成树形式为 H ′ ′ ( x ) = F ′ ( x ) G ′ ( x ) H''(x)=F'(x)G'(x) H(x)=F(x)G(x)

调用 N T T NTT NTT 即可。

仙人掌

(填坑

点双

(填坑

边双

(填坑

有向无环图

(填坑

强连通图

(填坑

posted @ 2022-10-10 20:18  缙云山车神  阅读(45)  评论(0编辑  收藏  举报