Address
Solution
- 看到题目只需要求二分图的两个点集而不需要求所有的边
- 我们可以想到求出二分图的一棵生成树
- 而这棵生成树就能唯一确定二分图的两个点集
- 看到操作次数限制,我们可以猜测需要使用的操作次数为 O ( n log n ) O(n\log n) O(nlogn)
- 考虑钦定一个生成树的根
- 每次把根 u u u 删掉,对剩下的每个连通块各找一个点 v v v 满足边 ( u , v ) (u,v) (u,v) 存在
- 然后对每个连通块继续跑生成树
- 这相当于模拟一遍 DFS 树的过程
- 考虑如何通过 O ( m log n ) O(m\log n) O(mlogn) ( m m m 表示 u u u 的子树个数)次操作求出 DFS 树上 u u u 的各个子节点
- 假设每个点有一个属性 a i a_i ai 表示删掉 u u u 之后 i i i 属于哪个连通块
- 我们要求的就是一个极小的点子集,使得这些点的属性值 a a a 并成连通块的全集
- 考虑二分求得 u u u 的编号最小的子节点
- 可以得到一个二分方案:如果 x x x 是满足「删掉所有满足 i < x i<x i<x 的边 ( u , i ) (u,i) (u,i) 之后图仍然连通」的最大的 x x x ,那么我们就可以知道 x x x 是 u u