乱写的主旋律
求原图的强连通边导出子图个数(\(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}\)(二项式定理),因此此题容斥系数同样为这个
一个点集可能有多种强连通分量划分方案,对于每个 \(k\) 都记录个数代价过大
根据容斥系数,设 \(g_S\) 为点集 \(S\) 带容斥系数的强连通分量划分个数,也就是划分个数奇数的方案减去划分个数偶数的方案
这里列出 \(f_S\) 和 \(g_S\) 的式子
其中 \(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)
这个式子应该比前面的要好理解,枚举新加入的强连通分量,为了不枚举重钦定要包含 \(\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(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(T,S-T)\) 可以 \(O(3^nn)\) 求,总复杂度 \(O(3^nn)\)