有标号DAG计数

有标号DAG计数

恩,很经典的问题。

\(f_i\)\(i\) 个点的有标号 DAG 个数。

我们的思路是尝试通过 “0出度点” 一圈一圈地往外扩张一个 DAG。

不妨设 \(g_{i,j}\)\(i\) 个点的 DAG,有 \(j\) 个点出度为 0 的方案数(这里dp定义里没有钦定了这 \(j\) 个点的标号)

则有 \(f_i=\sum_{j=1}^i g_{i,j}\)

注意到,我们钦定若干个点出度为零是容易的,但我们确定恰好个点出度为零是困难的,这启发我们进行容斥。

\(h_{i,j}\) 为钦定 \(j\) 个点出度为零的方案数,这里定义里没有钦定这些点的标号。

显然可以有:

\[h_{i,j}=f_{i-j}2^{(i-j)j}{i\choose j} \]

那么有:

\[\begin{aligned} f_{i}&=\sum_{j=1}^ig_{i,j}\\ &=\sum_{j=1}^i\sum_{k=j}^i(-1)^{k-j}{k\choose j}h_{i,j}\\ &=\sum_{j=1}^i\sum_{k=j}^i(-1)^{k-j}{k\choose j}f_{i-k}2^{(i-k)k}{i\choose k}\\ &=\sum_{k=1}^i(-1)^k{i\choose k}2^{(i-k)k}f_{i-k}\sum_{j=1}^k{k\choose j}(-1)^j\\ &=\sum_{k=1}^i(-1)^k{i\choose k}2^{(i-k)k}f_{i-k}(-1)\\ &=\sum_{k=1}^i(-1)^{k+1}{i\choose k}2^{(i-k)k}f_{i-k} \end{aligned} \]

考虑加速计算。

注意到有技巧:\((i-k)k={i\choose 2}-{k\choose 2}-{i-k\choose 2}\)

这就足以拆开了。

令:

\[\begin{cases} F(z)=\sum_{i=0}^n\frac{f_iz^i}{i!2^{i\choose 2}}\\ G(z)=\sum_{i=1}^n\frac{(-1)^{i+1}z^i}{i!2^{i\choose 2}} \end{cases} \]

注意 \(G(z)\) 没有常数项。

有因为 \(f_0=0\),因此有:

\[F(z)=G(z)F(z)+1\implies F(z)=\frac{1}{1-G(z)} \]

可以看出我们上面并没有考虑弱连通,如果考虑了会怎样呢?

设弱连通的 EGF 为 \(H(z)\),则设 \(N(z)=\sum \frac{f_iz^i}{i!}\) 是由若干个弱连通图组成的。

那么也即是:\(N(z)=\exp H(z)\)

因此对 \(N(z)\) 再求一次 \(\ln\) 即可。

posted @ 2025-04-07 21:19  spdarkle  阅读(71)  评论(0)    收藏  举报