打打打打打字机|

realFish

园龄:3年2个月粉丝:3关注:0

CF1033E 题解

题意

传送门

交互题,给定一个简单连通图,你可以询问一个点集 s,返回其导出子图的边数。判断此图是否为二分图:若是,输出其中一部点的集合;否则输出任一个奇环。最多询问 20000 次。

1n600

题解

对原图建立生成树,判断深度奇偶性相同的点是否有连边。

但建树的复杂度已经是 O(n2),且难以优化。注意到条件仅对深度有要求,那么尝试忽略树的形态,仅找出所有点的深度。

可以得出这样一个算法:先找到深度为 0 的点集(即 {1}),然后找出所有与其有连边的点,即为深度为 2 的点集。依次类推。

考虑一下 “找出 S 中与 T 有连边的所有点“ 的复杂度。显然有一个 O(|S|) 的做法,但不够。我们需要其与答案个数有关,便于均摊。那么考虑分治。判断 ST 是否有连边,可以通过 ask(ST)ask(S)ask(T)

那么就通过 O(nlogn) 得出了所有点的深度。于是可以判断二分图。还有一个问题是,若不是二分图,怎么找到奇环?

不妨设 S 为所有偶深度点的集合,且 ask(S)>0。那么通过枚举所有 xS,可以找出一个与 S{x} 有连边的点。再枚举一遍,就找到一条边 (x,y)。那么再找到它们到根的路径上的所有点即可,也就是找父亲。这显然可以通过二分。于是此题得解。

本文作者:realFish的博客

本文链接:https://www.cnblogs.com/fish07/p/17072517.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   realFish  阅读(16)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起