Loading

集合幂级数与子图连通问题

参考 cxy APIO 课件和 lgx 不知道从哪里搞来的什么课件,还有网上的众多博客。

集合幂级数

通俗讲就是状压。

可以用 FWT 进行一些简单运算,比如 OR/XOR/AND 卷积。

子集卷积

即求 \(H_S=\sum_{T\in S} F_TG_{S/T}=\sum_{A\ \text{or}\ B = S,A\ \text{and}\ B=\empty}F_AG_B\)\(A\ \text{and} \ B=\empty\) 相当于 \(|A|+|B|=|S|\),那么可以将 \(F,G\) 按照大小分成 \(n\) 组,然后对于每个大小分别 FWT,得到 \(H\) 按照大小分成 \(n\) 组的结果,对于 \(H_S\)\(H\) 中大小为 \(|S|\) 的组中的 \(S\),复杂度 \(O(2^nn^2)\)

子集卷积逆

要求 \(A_0=1,C_0=1\)

已知 \(A\times B=C\)\(A,C\),求 \(B\)。设 \(A^{-1}\) 使得 \(A\times A^{-1} = 1\),明显 \(A\times B \times A^{-1}=C\times A^{-1}\),利用组合意义理解一下就满足交换律 \(B=C\times A^{-1}\)

那么已知 \(F\),求出 \(G\) 使得 \(F\times G=1\),考虑暴力计算:

\[G_S=\frac{[S=\empty] - \sum_{T \subsetneq S}G_TF_{S-T}}{F_0} \]

复杂度 \(O(3^n)\),考虑分子右边的式子可以利用半在线的子集卷积处理即可,复杂度 \(O(2^nn^2)\)

\(\exp\)

要求 \(F_0=0\)

\[H=\sum_{i=1}^{n}\frac{F^i}{i!} \]

\(f_i\) 只保留 \(F\) 中大小为 \(i\)\(S\) 并乘上 \(i\),那么可得以下式子:

\[ig_i=\sum_{j=1}^{i} f_jg_{i-j} \]

用子集卷积做。复杂度 \(O(2^nn^2)\)

\(\ln\)

要求 \(G_0=1\)

\(\ln\)\(\exp\) 的逆。

\(g=\exp(f),f=\ln(g)\),考虑 \(\exp\) 的式子,可以转化为:

\[ig_i=f_ig_0 \sum_{j=1}^{i-1}f_jg_{i-j} \]

\[f_i=ig_i-\sum_{j=1}^{i-1}f_jg_{i-j} \]

用子集卷积做。复杂度 \(O(2^nn^2)\)

多项式复合集合幂级数

对于子集卷积,\(\exp,\ln\) 都属于复合,统一表示即为 \(F=\sum_{i=0}^n f^ih_i\)

如何挨个计算 \(f^i\) 复杂度 \(O(2^nn^3)\)。可以设 \(H_i=H_{i-1}\times f+h_{n-i}\),不过这样复杂度还是不变,考虑让 \(f\) 的加入顺序为按照 \(\max{S}\) 从小到大加入,此时 \(h_i\) 变为 \(i!h_i\),那么 \(H_i\) 的大小就是 \(2^i\),进行卷积的时候考虑枚举 \(f\)\(max{S}\) 卷即可。复杂度 \(O(\sum_{i=1}^n 2^ii^2)=O(2^nn^2)\)

所以搞了半天你告诉我 \(\ln,\exp\) 直接用复合做就好了。但是直接用子集卷积做 \(\ln,\exp\) 比用复合的方式做常数更小。复合常数是大约是卷积的 \(1.5\sim 2\) 倍。

\(\exp,\ln\) 组合意义

\(\exp\) 可以理解为对 \(S\) 进行划分成 \(S_1,\ldots,S_k\) 的权值和 \(\prod_{i=1}^k f_{S_i}\)\(\ln\) 就是反过来?

连通问题

以下问题都是:

给定一个无向图,对于每个子图,求有多少种选边(子图内的边)方案使得该子图是“?”。

连通图

设答案为 \(f\)。对于一个任意的选边方案,可以产生若干连通块,选边方案总数为 \(g_S=2^{ed(S)}\),知道 \(g=\exp f\),那么 \(f=\ln g\),求出即可。

连通二分图

设答案为 \(f\),考虑对 \(S\) 中的点黑白染色,那么染色方案为 \(2^{连通块数量}\),求出 \(S\) 的所有连边的黑白染色方案和,即 \(g_S=\sum_{T\subsetneq S}2^{ed(S)-ed(T)-ed(S-T)}\),子集卷积即可,那么 \(g=\exp f\)\(f=\ln g\)

考虑每次加入一个点,设 \(f_i\) 是加入了前 \(i\) 个点的连通块 \(S\) 的方案数,考虑如何计算 \(f_i\),如果 \(S\) 本身就和 \(i\) 不连通直接转移,否则将 \(i\) 连接的若干连通块合并。如下:

  • \(g_S=f_{i-1,S}\times ed(i, S)\)
  • \(f_i=f_{i-1}+\exp(g_S) \times \{i\}\)

复杂度 \(O(2^nn^2)\)

仙人掌

仙人掌可以理解为若干环的合并,一条割边也可以看作一条环。那么需要将这些环合并,找交界点即可,从 \(1\ldots n\) 枚举即可,用 \(\exp\) 合并,复杂度 \(O(2^nn^3)\)

有向图

DAG 定向

对一个子图的所有边定向,使得是 DAG 的方案数。

考虑每次删掉入度为 \(0\) 的点,但是如果一次没删干净那么就会算重,考虑容斥,如果删除 \(T\),系数为 \((-1)^{|T|+1}\)。发现可以用复合做,\(H_i=1\),复杂度 \(O(2^nn^2)\)

强连通子图

给定一个有向图,对于每个子图,求有多少种选边(子图内的边)方案使得该子图是强连通图。

设答案为 \(f\)。如果这不是一个强连通图,可以删除入度为 \(0\) 的强连通块,设 \(k=-f\)\(g=-\exp k\),那么 \(f_S=2^{ed(S)}-\sum_{T\subsetneq S}g_S2^{cross(T,S-T)+ed(T)}\),但 \(cross(T,S-T)\) 很难搞成卷积形式,所以应该只能 \(O(3^n)\)

双连通

问题形式和无向图的类似。

边双

考虑已经求出边双的方案,如何求连通,即“边双-连通 变换”。

\(p_i\) 为有割边相连的点的最大值不超过 \(i\),那么 \(p_0\) 就是边双的方案。那么从 \(p_i\) 推到 \(p_{i+1}\) 只需要加入这些割边即可:

  • \(q_{i,S}=[i\not \in S]p_{i,S} cof(i, S\cap \{1,\ldots,i-1\})\)
  • 如果 \(i\not \in S\)\((p_{i+1})_S=(p_i)_S\),否则 \((p_{i+1})_S=(p_i \times \exp(q_i))_S\)

反推就是“连通-边双 变换”,如果知道 \(p_{i+1}\) 那么可以知道 \(q_i\),直接子集卷积逆即可,细节就是卷的时候 \(p_i,p_{i+1}\) 都应该是不带 \(i\not \in S\)\(S\)。复杂度 \(O(2^nn^3)\)

点双

和边双类似。

最优化问题

给一个有向/无向图,求出有至少选多少条边使得这是一个边双/点双/强连通块。

和上文没啥关系,注意到这三种都可以耳分解解决,所以直接耳分解就没了,复杂度 \(O(2^nnm)\)

posted @ 2025-05-27 20:27  larsr  阅读(48)  评论(2)    收藏  举报