主旋律-强连通子图计数

核心思想:

强连通图难以刻画计数特征,因此我们一般选择将该图缩点后入度为零的点仅有一个来刻画强连通图

如需阅读请跳到下方非狗叫部分。

考虑设 \(f_S\) 为点集 \(S\) 为强连通图的方案数,使用容斥转移。

我们使用总方案数减去非强连通图的方案数。

非强连通图可以刻画为——缩点后存在不少于两个点的DAG。

那么我们可以钦定一个点集 \(T\),使得它被划分为若干个强连通分量,且各个强连通分量之间没边。

不妨设这个方案数为 \(A(S,T)\),但注意当 \(S=T\) 时我们要求划分 \(>1\) 个SCC。

同时我们设 \(B(S,T)\) 表示所有 \(A(S,T)\) 划分后这些强连通分量连向剩余的点,并使得剩余的点入度全部非零的方案数。

那么

\[f(S)=2^{|E(S)|}-\sum_{T\neq \varnothing,T\subseteq S}B(S,T) \]

但是我们注意到,我们不方便处理剩下的点入度全部非零,我们能做的只有将 \(T\to S/T\) 的边拿出来可选可不选。

那么这就又涉及到容斥了:我们无法做到确定出所有入度为零的强连通分量,而只能钦定。

考虑在 \(A(S,T)\) 中,将真实情况的每种强连通分量划分方案进行计算,设 划分了 \(m\)\(SCC\) 分别记作 \(S_1\sim S_m\),并设 \(W_{S_i}\) 表示所有划分方案里存在 \(i\) 这个强连通分量的方案集合。

\[A(S,T)=\sum_{S_1,S_2,S_3\dots S_m,S_i\cap S_j=\varnothing,T\subseteq \cup S_i }|\bigcap W_{S_i}|(-1)^m \]

根据容斥原理,我们对于一种真实的强连通分量划分方案 \((S_1,S_2,S_3\dots S_m)\) 有对于 \(\cup S_i\) 的所有子集 \(T\) 都会计算到,根据子集反演(\(A\) 是恰好,而 \(\cap W_{S_i}\) 是钦定,至少)可以得到,注意当 \(S=T\) 时要求 \(m>1\)

不妨设 \(C(S,T)=\sum_{S_1,S_2,S_3\dots S_m,\cup S_i=T}|\cap W_{S_i}|\)

那么这时候 \(B(S,T)\) 如何扩展计算呢?其实也是类似的,\(B\) 是恰好,那么我们通过枚举其超集也可进行容斥计算。

更形式化地:设 \(D(S,T)\) 为保证 \(T\) 中点都在某个入度为零的强连通分量中,保证 \(S=T\) 时不少于两个强连通分量,此刻的局面数。

\[D(S,T)=\sum_{T\subseteq T'}B(S,T')\implies B(S,T)=\sum_{T'\subseteq T} D(S,T')(-1)^{|T'|} \]

而很自然的

\[D(S,T)=C(S,T)2^{|T\to S/T|} \]

问题就在于如何计算 \(C(S,T)\)


以上都在狗叫

\(A(S|S_1,S_2\dots S_m)\) 为钦定当前图中强连通分量每个恰好由 \(S_1\dots S_m\) 组成,点集为 \(S\) 的图的个数(注意包含额外边)

\(S_1\cup S_2\dots S_m=S\) 时要求 \(m\ge 2\) 否则为假。

但注意到这个不好求,不妨设 \(B(S_1,S_2\dots S_m)\) 表示钦定这些点集组成了某些强连通分量的方案数。

不妨再设 \(H(S)\) 表示点集 \(S\) 内边数,设 \(W(S,T)\) 表示入点在 \(S\) 里且出点在 \(T\) 里的边数。

则显然有:

\[B(S_1,S_2\dots S_m)=2^{W(\cup S_i,S/{\cup S_i})+H(S/\cup S_i)}\prod_{i=1}^mf(S_i) \]

然后考虑通过子集反演:

\[A(S|S_1,S_2\dots S_m)=\sum_{m_1\ge m,\lbrace S_1\dots S_m\rbrace\subseteq \lbrace{T_1\dots T_{m_1}\rbrace}}B(T_1,T_2\dots T_{m_1})(-1)^{m_1-m} \]

这个带入容易证明。

那么再来就有:

注意到始终有 \(m\ge 1\)

\[\begin{aligned} f(S)&=2^{H(S)}-\sum A(S|S_1,S_2\dots S_m)\\ &=2^{H(S)}-\sum_{S_1\dots S_m,\color{red}{m\ge 1}}\sum_{\lbrace S_1\dots S_m\rbrace\subseteq \lbrace{T_1\dots T_{m_1}\rbrace}} B(T_1\dots T_{m_1})(-1)^{m_1-m}\\ &=2^{H(S)}-\sum_{T_1\dots T_{m_1}}B(T_1\dots T_{m_1})\sum_{\lbrace S_1\dots S_m\rbrace\subseteq \lbrace{T_1\dots T_{m_1}\rbrace},\color{red}{m\ge 1}}(-1)^{m_1-m}\\ &=2^{H(S)}-\sum_{T_1\dots T_{m_1}}B(T_1\dots T_{m_1})(-1)^{m_1+1} \end{aligned} \]

现在的问题在于怎么计算 \(B\)

注意到我们的贡献系数 \(2^{W(\cup S_i,S/{\cup S_i})+H(S/\cup S_i)}\) 只与 \(\cup S_i\) 有关。

因此可以考虑子集 DP 计算 \(B\)

具体地,设

\[g(T)=\sum_{T_1\cup T_2\dots \cup T_m}(-1)^{m+1}\prod_{i=1}^mf(T_i) \]

则有

\[g(T)=f(T)-\sum_{T'\subset T,\max(T)\in T'}f(T')g(T/(T')) \]

由此可以解决。

注意到我们在 \(A\) 里有限制:\(m=1\) 时要求 \(T\neq S\),其实相当于 \(g(S)\) 里面不算入 \(f(S)\)

那么就有:

\[f(S)=2^{H(S)}-\sum_{T\subseteq S}g(T)2^{W(T,S/T)+H(S/T)} \]

注意到 \(W\) 通过一定预处理可以 \(O(n)\) 单次计算。

因此 \(O(n3^n)\) 解决。

posted @ 2025-04-08 21:10  spdarkle  阅读(46)  评论(0)    收藏  举报