【清华集训 2014】主旋律

考虑容斥,统计不为强连通图的子图数量。

同时考虑 ( t DP),令 (g_S) 表示 (S) 这个子集的导出子图的子图构成强连通图的方案。

朴素的转移想法是暴力集合划分 (S) 中的点(至少划分成两个集合),每个点集内部构成强连通图,整体缩点后跑有向图子图 ( t DAG) 数即可。

这样显然复杂度爆炸,无法通过本题。

常见的想法是将两个部分和为一体,回忆有向图子图 ( t DAG) 数的做法,令 (f_S) 为点集 (S) 的导出子图的子图 ( t DAG) 数,有转移:

[f_S = sumlimits_{T subseteq S, T e varnothing} (-1) ^ {|T| - 1} imes 2 ^ {ways(T, S - T)} imes f_{S - T} ]

由此我们只需直到选出 (T) 构成若干个强连通分量的贡献和即可,而不需要直到具体的强连通分量划分,令这个量为 (h_T)

(h_0 = -1),有转移:

[h_S = -sumlimits_{T subseteq S, T e varnothing} g_T imes h_{S - T} ]

但由于集合是无标号的,因此这样会记重,常见的想法是每次钦定 (S) 中最后一个数(取 ( t lowbit))在 (T) 中即可。

此时我们直接改写 (f_S) 的状态,表示点集 (S) 的导出子图的子图不构成强连通分量的方案,那么有转移:

[f_S = sumlimits_{T subseteq S, T e varnothing} h_T imes 2 ^ {ways(T, S - T)} imes 2 ^ {ways(S - T, S - T)} ]

显然有 (g_S = 2 ^ {ways(S, S)} - f_S)

注意以下转移的顺序,我们先转移 (h),但不转移 (S ightarrow S),这样可以保证 (f) 不出现仅由单个强连通分量组成的情况。

转移完 (f) 后我们再转移 (h) 中单个强连通分量的情况。

复杂度 (mathcal{O}(3 ^ n))

GO!
原文地址:https://www.cnblogs.com/Go7338395/p/14907444.html