【UR #21】挑战最大团
题面
定义一个简单无向图 \(G\) 是“优美”的,当且仅当对 \(G\) 中任意四个不同点 \(A,B,C,D\),若 \(AB,BC,CD\) 间均有边,则 \(AC,BD,AD\) 间不可能同时没有边(即要么 \(AC\) 有边,要么 \(BD\) 有边,要么 \(AD\) 有边)。
给定一个 \(n\) 个点的“优美”的简单无向图 \(G\) ,你要对所有 \(i=1\sim n\),求出 \(G\) 中有多少个点集子集的生成子图同构于 \(i\) 个点的完全图。对 \(998244353\) 取模。
数据范围: \(n\le 8000\) 。边按照领接矩阵输入。
题解
既然题目告诉你这是个优美的图,所以肯定要去分析其中的性质的。
性质一:优美的图的子图和补图仍然是优美的,并且优美的图和它的补图不能同时连通。
这个的证明可以在官方题解中学习,只能说想不到(估计也注意不到)。
有了这个优美的性质,我们考虑如何计算。
对于一个图 \(G\),我们设 \(F_{G}(x)\) 为其生成函数。
- 若图 \(G\) 正图不连通,那么我们就不能同时选两个联通块的点,所以 \(F_{G}(x)=\sum_{T\text{是连通块}} F_{T}(x)\) 。
- 若图 \(G\) 补图不连通,那么只要各个补图连通块内成团,联通块之间是可以任选的,所以 \(F_{G}(x)=\prod_{T\text{是连通块}} F_{T}(x)\) 。
所以就有暴力,我们之间用 BFS 判断连通性,找到连通块就递归求解。
现在考虑优化。
既然是分裂,我们能不能用启发式分裂的思想,使得两个联通块之间大小差不多,或者如果能够分裂成大小为 \(x\) 和 \(y\) 的部分,我们的复杂度是关于 \(\min(x,y)\) 的呢?
第一种很明显是不行的,因为分裂的方案是根据图固定的。
那么我们就考虑第二种思想。
性质二:无论正图还是补图,只要联通,那么这个图的直径为 \(2\) 。
因为补图不联通,所以对于点 \(x\) ,可以一步到达所有在补图中与 \(x\) 不是同一联通块的点,之后一步再到达与 \(x\) 是同一连通块的点。
而且对于一个图,设其正图最小度数的点为 \(x\),那么如果正图不联通,那么最小的一个连通块大小就是 \(\deg_x\),补图同理。
设补图度数最小的为 \(y\) ,所以我们可以找到其中度数更小的 (先假设是 \(x\),\(y\) 的情况是一样的)然后先找到与 \(x\) 相连的点,然后只扫描这些点的边,判断是否能遍历整个图,如果不能那么就找到了,递归即可,而没有找到,再尝试 \(y\) 。
这样一次的复杂度是 \(O(\deg_x)\) ,总复杂度就是 \(O(n^2\log n)\) 的。
通过bitset
优化遍历的过程可以让复杂度降至 \(O(\frac{n^2\log n}{w}+n^2)\) 。
启发
-
一种新的启发式的操作形式:
在合并/分裂的时候,如果能够合并把 \(x,y\rightarrow x+y\),\(x+y\rightarrow x,y\) ,并且复杂度是关于 \(\min(x,y)k\) ,那么整个的复杂度就是 \(O(nk\log n)\) 的。
-
bitset
可以优化判断图联通的情况。