[UOJ#461]新年的Dog划分(交互 | DFS + 二分)

该博客详细解析了UOJ第461题的解决方案,重点在于如何通过DFS和二分查找构建二分图的一棵生成树,并以此确定二分图的点集。博主提出了一种O(nlogn)复杂度的算法,通过删除边并模拟DFS树的过程来判断图是否为二分图。在确保不超过操作次数限制的同时,逐步构建并染色生成树。
摘要由CSDN通过智能技术生成

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 &lt; x i&lt;x i<x 的边 ( u , i )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值