乱写的主旋律

求原图的强连通边导出子图个数(\(n\leq 15\)


如何关于强连通刻画一个图

将每个强连通分量缩成一个点后图必定是个 DAG

而题目的答案对应的 DAG 一定是单点

因此考虑数大小大于 \(1\) 的上述 DAG 的个数,再用总 DAG 个数减去前者即为答案

\(f_S\) 表示点集 \(S\) 的强连通边导出子图个数,也就是题目答案

类似于 Amusement Park 一题,对于 DAG 通过删去其所有入度为 \(0\) 的点来计数

若加入点集 \(T\),容斥系数为 \((-1)^{k+1}\),其中 \(k\) 是点集 \(T\) 划分出的强连通分量个数

这是因为对于容斥系数我们只关心 DAG 的形态,自然也就不关心 DAG 上的点对应的原图上的强连通分量的信息

而在 Amusement Park 中,容斥系数即为 \((-1)^{|T|+1}\)(二项式定理),因此此题容斥系数同样为这个

\[\sum_{i=1}^{n} \binom{n}{i} (-1)^{i+1}=1 \]

一个点集可能有多种强连通分量划分方案,对于每个 \(k\) 都记录个数代价过大

根据容斥系数,设 \(g_S\) 为点集 \(S\) 带容斥系数的强连通分量划分个数,也就是划分个数奇数的方案减去划分个数偶数的方案

这里列出 \(f_S\)\(g_S\) 的式子

\[f_S=2^{E_S}-\sum_{T\subseteq S,T\neq \varnothing} g_{T}2^{E(T,S-T)+E_{S-T}} \]

其中 \(E_S\) 为点集 \(S\) 内部的边的个数,\(E(S,T)\) 为从点集 \(S\) 出发到点集 \(T\) 的有向边的个数(保证 \(S\cap T=\varnothing\)

\(2^{E_S}\) 为总 DAG 个数,因为原图每个边导出子图都对应一个 DAG,所以数量是相等的

钦定 DAG 上零度点集合对应的原图上的点集后,容斥系数已经包含在 \(g_S\) 内,因此只需要考虑有多少个合法的原图

首先 \(T\) 内的边不需要也不应到考虑,因为这些边已经被 \(g_T\) 考虑过了

因为我们钦定的零度点是入度为 \(0\) 的点,因此不能有任何从 \(S-T\)\(T\) 的边,这部分的方案数是 \(1\)

但是我们对点集 \(T\) 的出度没有做任何限制,并且从来没有要求过图必须连通,所以从 \(T\)\(S-T\) 的边可以选或者不选,这部分方案数是 \(2^{E(T,S-T)}\)

对于 \(S-T\) 内部,在加入零度点的这一过程中我们并没有对其形态做出任何限制,对于原图的任意形态也都能对应到 DAG 图上的一个形态,因此 \(S-T\) 中的边也是可以选或者不选,这部分方案数是 \(2^{E_{S-T}}\)

一个容易混淆的点是,在 Amusement Park 一题中,与零度点拼接的部分要求是一个合法的 DAG,但在这题中剩余点集的任意边导出子图都是合法的,这是因为我们要统计的东西不同,前者统计的是合法 DAG,后者统计的是所有图(均可以映射到一个合法 DAG)

\[g_S=f_S-\sum_{T\subset S,T\cap \text{lowbit}(S)\neq \varnothing} f_Tg_{S-T} \]

这个式子应该比前面的要好理解,枚举新加入的强连通分量,为了不枚举重钦定要包含 \(\text{lowbit}(S)\)

最前面的 \(f_S\) 是所有点在一个强连通分量里,个数是奇数所以系数是 \(1\)

后面的部分相当于在原来的基础上多了一个强连通分量,系数要乘上 \(-1\)

注意这里 \(f\)\(g\) 会产生依赖关系,根据定义先算 \(g\) 的后半部分(前面的含义是一个强连通)并贡献到 \(f\) 后再计算真正的 \(g\)

由于枚举子集是 \(O(3^n)\),查表 \(O(1)\),所以单计算这两个式子是 \(O(3^n)\)

发现瓶颈在于计算 \(E(T,S-T)\),复杂度 \(O(3^nn^2)\)

可以直接位运算优化,但还是学习一下题解

假设 \(U\) 是全集,考虑两条式子

\[E(T,U-T)=E(T,U-S)+E(T,S-T)\\ E(S,U-S)=E(T,U-S)+E(S-T,U-S) \]

代入

\[E(T,U-T)=E(S,U-S)-E(S-T,U-S)+E(T,S-T)\\ E(T,S-T)=E(T,U-T)-E(S,U-S)+E(S-T,U-S)\\ \]

发现 \(E(U,U-X)\) 可以 \(O(2^nn^2)\)

虽然 \(S-T\)\(U-S\) 不交,但种类个数还是 \(3^n\) 的,这对吗

其实可以令 \(cnt_{S,i}\) 表示点 \(i\) 连向点集 \(U-S\) 的边的个数,即 \(E({i},U_S)\),可以 \(O(2^nn)\)

\[E(S-T,U-S)=\sum_{i\in (S-T)} E(\{i\},U-S)=\sum_{i\in(S-T)} cnt_{S,i} \]

于是 \(E(T,S-T)\) 可以 \(O(3^nn)\) 求,总复杂度 \(O(3^nn)\)

posted @ 2025-06-02 14:12  Lyz09  阅读(6)  评论(0)    收藏  举报