[ARC105F] Lights Out on Connected Graph

黑题好题。

洛谷入口

广义做法:计数题 + 简易容斥 + 子集和问题

学习点:

将连通图计数转换为任意图计数 − - 非连通图个数。

利用钦点防止重复计算。


[ARC105F] Lights Out on Connected Graph

有一张 n n n 个点 m m m 条边的简单无向图,问选出一个边集,使得 n n n 个点与这些边构成的图为连通二分图的方案数。

998244353 998244353 998244353 取模。

1 ≤ n ≤ 17 , n − 1 ≤ m ≤ n ( n − 1 ) 2 1\le n\le 17,n-1\le m\le \large \frac{n(n-1)}{2} 1n17,n1m2n(n1)

二分图补充

注意二分图分为连通二分图和非连通二分图。

二分图有个好用的性质:可以进行黑白染色。通俗的讲,对于一个二分图,一定存在一种染色方案,使得没有任何两个有边相连的点的颜色相同。

另外,我们设有点集 S , T S,T S,T,若满足 S S S 中任意两点都无边相连、 T T T 中任意两点都无边相连,则由 S S S 点集 T T T点集 及 S S S 中的点连向 T T T 中的点的构成的图一定是二分图。当然,该二分图不一定连通。

解析

枚举边集的时间复杂度显然过高,考虑枚举点集,计算每个点集对答案的贡献。

首先,控制点集组成的图连通太困难了,先计算任意图的情况。我们设 g ( S ) g(S) g(S) 表示点集 S S S 所有染色方案对应的可行图个数(注意不一定连通)。可以通过枚举 S S S 的子集求解,则 g ( S ) = ∑ T ⊆ S 2 c n t S − c n t T − c n t S − T \large g(S)=\sum\limits_{T⊆S}2^{cnt_S-cnt_T-cnt_{S-T}} g(S)=TS2cntScntTcntST,其中 S − T S-T ST 表示 T T T 关于 S S S 的补集, c n t U cnt_U cntU 表示点集 U U U 内部连接的边数。 基本原理源于上方斜体字。

上面及接下来也需要的枚举子集过程可以不用 SOS DP,时限 3s , O ( 3 n ) O(3^n) O(3n) 的方法可以过。

然后需要求解连通二分图的个数。我们设 f ( S ) f(S) f(S) 表示点集 S S S 所有染色方案对应的可行连通图个数,思路是将连通图计数由任意图计数 − - 非连通图个数得到。任意图计数即为 g ( S ) g(S) g(S),这时候可以发现非连通图的情况有很多,但共同点在于其均可以看作由两个及以上个小的连通块形成。所以我们可以先将连通图(称为 P P P)拆成两块,即钦定一个点(以下称钦点),保证其中一块(设为 P ′ P' P)中包含钦点,这时另一个连通块(设为 P ′ ′ P'' P′′)是任意图都可以确保 P P P 不连通。

而钦点的作用在于其可以防止计算重复,在枚举 P ′ P' P 的过程中确保了图的的非重。

可列得

f ( S ) = ∑ T ⊆ S f ( T )   ⋅   g ( S − T ) \large f(S)=\sum\limits_{T⊆S}f(T)\ \cdot\ g(S-T) f(S)=TSf(T)  g(ST)

注意点集 T T T 为钦点所在的点集,钦点可设为点集 S S S 中的任一点,我用的是 S S S 中最小的点。

代码 然而只是给我看的

你可能感兴趣的:(题解,学习,总结与反思,c++,算法,深度学习,学习方法,动态规划,迭代加深,抽象代数)