CF906C题解

发布时间 2023-10-02 19:20:29作者: cool_milo

可能更好的阅读体验

大家好,我和 DP 有仇,所以我用猜结论的方法过了这道题。

可能是这道题的一个全新思路,可能人自闭久了什么都能想出来(((

upd:好像这也是官方题解思路,看来大家做题不太喜欢看 CF 官方题解(((

首先考虑一个问题:如果这是一道构造题,怎么构造一组合法的解?
在草稿纸上画了很久之后,我发现:只需要在原图上找到一棵生成树,依此从叶子到根操作所有的点,就能得到一个 \(n\) 个点的团。其中叶子不用操作。那么操作次数是 \(n - leaf_T\) 次。
很难想到更好的策略了。所以我先写了一个枚举哪些点是叶子的 \(\Theta(n^2 2^n)\)暴力,发现没有 WA 的点。复制了后面的测试点发现答案都是对的。
很懵逼。外层的枚举叶子应该是无法优化了,内层的 check 怎么优化呢?我们发现我们要 check 两件事:

  • 非叶节点连通
  • 所有叶节点都有向非叶节点的边

可以对于每个点处理它向哪些点连边,用一个二进制数 \(State_i\) 存下来。
第一个要求可以预处理两个一个数组 \(ok_S\),表示 \(S\) 这个集合是否连通。枚举 \(j \in S\)\(j\) 是否向 \(S\) 中其他元素连边就能递推了。
第二个要求可以直接对于每个叶节点的 \(State_i\) 查找是否有非叶节点。

那么复杂度就被降为 \(\Theta(n 2^n)\),就可以通过这道题了。注意特判掉给出的图就是完全图的情况。

怎么证明结论呢?这里用官方题解的话说:

假设被操作的最小点集是 \(T\)
首先,\(T\) 必然连通,否则在不同的连通块之间就没法加上边。
其次,所有不在 \(T\) 中的点必然和 \(T\) 中的点有连边,否则这些点上无法加上新的边。
现在,我随便找出 \(T\) 的一棵生成树 \(T'\),那么,所有不在 \(T\) 中的点就可以向 \(T'\) 连边,得到一棵以 \(T'\) 为非叶节点的原图的生成树。(\(T'\) 中如果有叶节点就一定不优,矛盾。)结论得证。

当了一把官方题解搬运工