[BZOJ4025] 二分图(线段树分治+可撤销并查集)

博客介绍了如何利用线段树分治和可撤销并查集解决在动态边集合中判断每个时刻图是否为二分图的问题。通过将边按出现和消失时间建模,利用线段树处理边的插入,再结合带权并查集判断图的二分性,确保在O(n log^2 n)的时间复杂度内完成操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

  • 给你 n n n个点, m m m条边,每条边有一个出现时间和一个消失时间,求出每一个时刻当前图是否为二分图( n ≤ 1 0 5 , m ≤ 2 × 1 0 5 n\le10^5,m\le2\times10^5 n105,m2×105)。

感谢Inspector_Javert的这篇博客,让我看懂了什么是线段树分治。

首先我们要知道如何判定一个图是不是二分图,那就是这个图不存在奇环。然后我们可以以时间为轴建立线段树,把每条边放到线段树中,由线段树的性质我们可以知道每条边最多出现 log ⁡ n \log n logn次,然后我们深搜这棵时间线段树,每次把路径上的所有节点上的所有边全部加入,然后判定当前图是不是二分图,那么现在问题就被我们转化成了给定一些边(支持删除)的二分图判定问题,我们考虑来解决这个问题。

我们可以用一个按秩合并的带权并查集来实现,每个点记录到父亲的树上距离,每次在连通图上加边时判定路径长度奇偶性即可,每次加入一条边 ( x , y ) (x,y) (x,y)时,设 x x x在并查集的根节点为 u u u y y y在并查集的根节点为 v v v,那么 u u u v v v的距离就是 u − x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值