图计数

主要有无向图中连通图计数,二分图计数,欧拉图计数。这里先不赘述因为写在其他里面了,模板是这个,现在我们讨论有向图DAG计数和强连通分量计数。这两个都是针对原图的一个生成子图进行计数

DAG计数

\(f_S\)表示\(S\)的生成子图是\(DAG\)的方案数。考虑转移。我们利用入度为\(0\)的点进行转移。枚举\(T\subseteq S\),让\(T\)中的所有点都是入度为\(0\)的点,那么就会有\(W(T,S\setminus T)\times f_{S\setminus T}\)的值共享给\(S\)。但是考虑,如果一个\(DAG\)的入度为\(0\)的点的集合为\(T\),那么我们会枚举到\(T'\subseteq T\)而把这种方案多贡献,所以我们需要容斥。考虑容斥系数。结论是系数为\((-1)^{|T|+1}\)。证明就是\(\sum_{i=1}^{|T|}\binom{|T|}{i}(-1)^{i+1}=1\)。这样就保证了同一种情况只会算一次。所以这样我们就得到了最后的式子就是\(f_{S}=\sum_{T\subseteq S}(-1)^{|T|+1}\times w(T,S\setminus T)\times f_{S\setminus T}\)。现在我们考虑如何求\(w(T,S\setminus T)\)。我们对于一个\(S\)求出所有的\(w(T)\)表示\(w(T,S\setminus T)\)。我们只需要从大到小枚举子集,然后找到一个\(x\in T\)然后把\(x\to S\setminus T\)。然后更新一下就行。所以就完了

强连通图计数

\(f_S\)表示答案。我们考虑直接求太困难了,我们容斥掉。当一个图不是强连通图,那么他所点以后一定变成一个多个点的\(DAG\)所以我们考虑转成\(DAG\)计数。我们设\(h_S\)表示把\(S\)这个集合变成若干个互相独立的强连通分量,记录分成奇数个的方案减去偶数个的方案。分成互相独立的强连通分量等价于变成入度为零的点。而记录奇数-偶数是为了搞内阁容斥系数。那么答案就比较清楚了,\(f_{S}=2^{edge_S}-\sum_{T\subseteq S}h_T\times w(T,S\setminus T)\times 2^{edge_{S\setminus T}}\)。前面就是刚刚说的,后面随便搞然后缩点都是\(DAG\)。那么\(h_{S}=\sum_{lowbit(T)=lowbit(S)}f_T\times h_{S\setminus T}\)\(lowbit\)的限制就是相当于枚举一个点所在的强连通分量。然后找。注意,我们要先更新\(h_S\),再更新\(f_S\),最后把\(f_S\)的答案在贡献给\(h_S\),因为对于\(f_S\)的枚举中,我们不能让\(S\)变成一个强连通分量,所以\(h_S\)中不能存\(f_S\)的贡献。那么就没了。其他和上面就一样了。

posted @ 2026-04-26 21:27  lghjl  阅读(2)  评论(0)    收藏  举报