有标号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\) 即可。

浙公网安备 33010602011771号