【题解】「清华集训2014」主旋律
前言:
离联合省选 29 天,颓了一上午。
为防止歧义,本文使用 ISO-80000-2 中的要求:用 \(\subseteq\) 表示子集,\(\subset\) 表示真子集。
本题融合了 容斥,图论相关,缩点,状压 dp,男同性恋,子集反演 等多种知识,是一道不可多得的好题。
题意:求一个图的强连通生成子图的个数,\(n\leq 15\)。
这个问题看着非常不可作,于是正男则反,考虑不是强连通子图的个数:
不是强连通子图的图一定在缩点后会形成DAG,而将图删边/定向成为 DAG 是一个较为经典的容斥问题。
我们考虑该图缩点后形成了若干个点的 DAG,那么枚举 DAG 的源点层即可转移到一个互不连边的集合(有向图好像不能叫独立集?)和另一个 DAG 的情况,但是钦定了 DAG 的源点层并不能保证剩下的图的所有点一定都不是源点,所以考虑一个经典的容斥。
上面那个关系是“钦定子集——恰好”的形式,所以考虑使用子集反演:
下面这段内容的定义均为 缩点后 的 DAG 上。
令 \(U(S)\) 表示钦定子集 \(S\) 是源点层的方案数,\(V(S)\) 是恰好集合 \(S\) 中的点为源点层的方案数,\(f(S)\) 表示 \(S\) 构成缩点后的非孤点 DAG 数量。
则有
注意 空集是不能取的!。
其实这个容斥就是把这里边的二项式反演换成了子集反演,不难发现子集反演是严格强于二项式反演的。
下面的部分是在原图意义上的:
然后现在我们转移出的方案数是之和这一层钦定的强连通分量数量相关,更进一步地,或者说,之和强连通个数的奇偶相关。
所以我们需要求原图中某些子集划分成奇数个,或者偶数个强连通分量的方案数,不如直接点,求容斥系数之和,因为将 \(-1\) 的系数分摊到每一个强连通分量上。
令 \(g(S)\) 表示集合 \(S\) 的容斥系数之和,\(h(S)\) 表示集合 \(S\) 是一个强连通分量的方案数,可以用 \(f(S)\) 直接得出。
注意我们原本求出的 \(g(S)\) 对于目前的 \(S\) 是不包含把整个图当作一个强连通分量的而 \(g(S)\) 对于目前的 \(f(S)\) 的系数显然是 1,代入上面的式子就能求出这个图至少两个强连通分量的方案数以求出 \(f(S)\)。
所以有:
时间复杂度 \(O(3^n)\) ,因为涉及到指数上的边集大小,所以 【我感觉,应该是,大概也许】没有 \(O(2^n\text{poly}(n))\) 集合幂级数的复杂度了吧,如果有神仙会的话欢迎和我讨论。
这 是一份 \(O(3^n+3^{n-1}n)\) 的实现。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17171735.html,谢谢你的阅读或转载!