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

· · 算法·理论

参考 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_BA\ \text{and} \ B=\empty 相当于 |A|+|B|=|S|,那么可以将 F,G 按照大小分成 n 组,然后对于每个大小分别 FWT,得到 H 按照大小分成 n 组的结果,对于 H_SH 中大小为 |S| 的组中的 S,复杂度 O(2^nn^2)

子集卷积逆

要求 A_0=1,C_0=1

已知 A\times B=CA,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 中大小为 iS 并乘上 i,那么可得以下式子:

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

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

\ln

要求 G_0=1

$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)$。