生成树计数
矩阵树(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=D−A
去掉 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)! 根向生成树的个数×∏v∈V(degv−1)! , 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)×v∈V∏(degv−1)!
树(图)的计数的多项式算法
小朋友与二叉树
我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树。
考虑一个含有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)=∑n≥0[n∈C]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±1−4G(x)F(x)=1±1−4G(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+1−4G(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+i∈S∑Fi(x)
令
G
(
x
)
=
x
−
∑
i
∈
S
x
i
G(x)=x-\sum_{i\in S}x^i
G(x)=x−∑i∈Sxi 。那么
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}) 2n∏i=1ngai−∏i=1n(gai−hai)
已知 F ( x ) = ∑ i i − 2 i ! x i F(x)=\sum\frac{i^{i-2}}{i!}x^i F(x)=∑i!ii−2xi , 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=0n−2fi+1gn−i−1(in−2) 。
生成树形式为 H ′ ′ ( x ) = F ′ ( x ) G ′ ( x ) H''(x)=F'(x)G'(x) H′′(x)=F′(x)G′(x) 。
调用 N T T NTT NTT 即可。
仙人掌
(填坑
点双
(填坑
边双
(填坑
有向无环图
(填坑
强连通图
(填坑