题意: 给你一个图中每个点出现与消失的时刻,求在每一个时刻中该图是否为二分图。
这道题可以说是LCT维护动态生成树的集大成题。其中加入了二分图模型,对于以后很多的题目都具有启示意义。
对于这道题,我们考虑维护以删除时间为关键字的最大生成树。对于整个图来说,就是一个最大生成森林。
在每一时刻,在生成森林中,对于每一条出现的边:
如果该边两端不联通,则加入该边。
如果该边两端联通,将该边连上后会出现一个环。
如果这个环是奇环,那么将该环中删除时间最早(权值最小)的边删除,并加入标记集合,表示该边存在时,图不为二分图。
具体实现的话,就是先将出现边与原路径中的最小边比较,如果比最小边要小,则直接判断是否为奇环加标记即可。
如果比最小边要大,那么就删除最小边,连接上该边,将最小边拿去判断。
对于每一条删除的边:
如果这条边在树上,直接cut。
如果这条边在删除集合里,直接去掉。
每一个时刻,当且仅当集合内没有元素时,图为二分图。
维护生成树中最小/大边,我采用的是维护指针的方法。指针减去初指针就为实际下标了。
判断是否为奇环,就维护LCT的size即可。注意边的size设为0。
注意这道题的联通性不能用普通并查集,因为有cut操作。我直接暴力判断的联通性。
|
|