无向连通图
$n$个点的有编号的无向连通图计数
令$f[i]$表示$i$个点的答案,不妨考虑总数减去不连通的个数。
则$ f[i]=2^{C(i,2)}-\sum_{j=1}^{i-1}f[j]*C(i-1,j-1)*2^{C(i-j,2)} $
即考虑$1$所在的联通块的大小。
这个式子还可以通过分治FFT优化。
DAG计数
$n$个点的有编号的DAG计数
令$f[i]$表示$i$个点的答案,则考虑枚举哪些是入度为$0$的点。
但是直接统计不好统计,但是可以算出至少有$j$个点入度为$0$的点的方案数,即为$2^{j*(i-j)}*C(i,j)*f[i-j]$。
那么容斥一下,可以得出:$f[i]=\sum_{j=1}^{i}(-1)^{j-1}*2^{j*(i-j)}*C(i,j)*f[i-j]$。
可以发现,在这个容斥中,对于入度为$0$的点恰好有$j$个的方案被统计了$\sum_{k=1}^{j}(-1)^{k-1}*C(j,k)=-\sum_{k=0}^{j}(-1)^k*C(j,k)+C(j,0)=-[j==0]+1$,所以这个容斥将每个恰好有$j$个入度为$0$的点的方案正好都统计了一遍。
同时,这个式子也可以通过分治FFT优化。
弱连通DAG计数
$n$个点的有编号的弱联通DAG计数
像考虑连通图那样考虑,即答案为所有方案数减去不连通的个数。
则令$f[i]$为$i$个点的答案数,$g[i]$为$i$个点的DAG数。
通过枚举$1$所在的联通块可以得到:$f[i]=g[i]-\sum_{j=1}^{i-1}C(i-1,j-1)*f[j]*g[i-j]$
强连通图计数
$n$个点的有编号的强连通图计数。
考虑不是强连通图的图,那么一定在缩点之后至少有两个点。
所以这启发了我们通过枚举缩点后的点来统计不是强连通图。
在DAG计数中有$f[i]=\sum_{j=1}^{i}(-1)^{j-1}*2^{j*(i-j)}*C(i,j)*f[j]$
现在,这里的点是一些点缩点后的点,不妨称作一个团。
但是我们发现,枚举团是非常复杂的,因为枚举每个点属于哪一个团的时间复杂度非常高。
进而我们可以枚举这j个团是由哪些点组成的,而不考虑其他点的情况。
令$ans[i]$为i个点的答案,$g[i][j]$为$i$个点组成$j$个团的方案数(不同团之间没有边)。
则可以得到$ans[i]=2^{2*C(i,2)}-\sum_{k=1}^{i}\sum_{j=1}^{k}g[k][j]*C(i,k)*(-1)^{j-1}*2^{k*(i-k)}*\sum_{j=1}^{i-k}f[j]+ans[i]$
(末尾的$ans[i]$可以通过不枚举g[n][1]来减掉,但是这么做就很难用多项式优化)
但是我们发现,这个式子的最后一项,即$i-k$个点组成的$j$个团所形成的DAG个数,这一项等价于$2^{2*C(i-k,2)}$,因为对于$i-k$个点任意的有向图,在缩点后形成的团,一定是一个DAG。
所以$ans[i]$可以表示为:
$ans[i]=2^{2*C(i,2)}-\sum_{k=1}^{i}\sum_{j=1}^{k}g[k][j]*C(i,k)*(-1)^{j-1}*2^{k*(i-k)}*2^{2*C(i-k,2)}+ans[i]$
再考虑怎么求$g[i][j]$,一种方法是枚举哪些点在一个团中,再通过$ans[i]$来转移,这样的做法,最终的时间复杂度是$N^3$的。
另一种方法更为巧妙,令$G[i]=\sum_{j=1}^{i}(-1)^{j-1}*g[i][j]$。
考虑j个团对$G[i]$的贡献,即奇正偶负,则通过枚举1所在的团的大小,可以得到$G[i]=ans[i]-\sum_{j=1}^{i-1}C(i-1,j-1)*ans[j]*G[i-j]$。
这样$ans[i]$的式子即为
$ans[i]=2^{2*C(i,2)}-\sum_{k=1}^{i}G[k]*C(i,k)*2^{k*(i-k)}*2^{2*C(i-k,2)}+ans[i]$
令$h[i]=2^{2*C(i,2)}$
然后两边同减掉$ans[i]$,再提出$G[n]$则可以推出:
$G[i]=h[i]-\sum_{j=1}^{i-1}G[j]*h[i-j]*2^{j*(i-j)}*C(i,j)$
又可以推出
$ans[i]=G[i]+\sum_{j=1}^{i-1}ans[j]*G[i-j]*C(i-1,j-1)$
这样,便可以在$N^2$的时间复杂度解决这个问题。
对于$NlogN$的做法,用多项式技巧即可。