【清华集训 2014】主旋律
考虑容斥,统计不为强连通图的子图数量。
同时考虑 \(\tt DP\),令 \(g_S\) 表示 \(S\) 这个子集的导出子图的子图构成强连通图的方案。
朴素的转移想法是暴力集合划分 \(S\) 中的点(至少划分成两个集合),每个点集内部构成强连通图,整体缩点后跑有向图子图 \(\tt DAG\) 数即可。
这样显然复杂度爆炸,无法通过本题。
常见的想法是将两个部分和为一体,回忆有向图子图 \(\tt DAG\) 数的做法,令 \(f_S\) 为点集 \(S\) 的导出子图的子图 \(\tt DAG\) 数,有转移:
\[f_S = \sum\limits_{T \subseteq S, T \ne \varnothing} (-1) ^ {|T| - 1} \times 2 ^ {ways(T, S - T)} \times f_{S - T}
\]
由此我们只需直到选出 \(T\) 构成若干个强连通分量的贡献和即可,而不需要直到具体的强连通分量划分,令这个量为 \(h_T\)。
\(h_0 = -1\),有转移:
\[h_S = -\sum\limits_{T \subseteq S, T \ne \varnothing} g_T \times h_{S - T}
\]
但由于集合是无标号的,因此这样会记重,常见的想法是每次钦定 \(S\) 中最后一个数(取 \(\tt lowbit\))在 \(T\) 中即可。
此时我们直接改写 \(f_S\) 的状态,表示点集 \(S\) 的导出子图的子图不构成强连通分量的方案,那么有转移:
\[f_S = \sum\limits_{T \subseteq S, T \ne \varnothing} h_T \times 2 ^ {ways(T, S - T)} \times 2 ^ {ways(S - T, S - T)}
\]
显然有 \(g_S = 2 ^ {ways(S, S)} - f_S\)。
注意以下转移的顺序,我们先转移 \(h\),但不转移 \(S \rightarrow S\),这样可以保证 \(f\) 不出现仅由单个强连通分量组成的情况。
转移完 \(f\) 后我们再转移 \(h\) 中单个强连通分量的情况。
复杂度 \(\mathcal{O}(3 ^ n)\)。