[CF813F]Bipartite Checking
Bipartite Checking
题解
线段树分治的板子题。
根据时间加边与删边,如果直接维护这个图的话明显会T,当然只加边的画不会,但由于会删边,我们每次判图都必须跑一遍这个图,于是就需要,明显会T,于是就要用线段树分治来维护每个时间上的边。
我们建一棵树来维护每个时间的图,从根到叶子的链上构成的图就是叶子这个时间节点的图的状态。每次删边时,就在这条边存在的时间区间上加上这条边。这样就可以维护任意时间点的图,保证我们到任意点时只会有加边的操作,不会去删边。
至于如何判断二分图,我们在点上都是维护了一个只有加边动态图的,如果回溯的话只需要撤销最后加的那一条边。我们用一个带权并查集去维护这个图,而并查集维护的图又一定是一棵树,而加一条边是可以解决的。为了避免卡并查集,还需要按秩合并去保证树高。
插入边时若这条边连接了两棵未连接的树,明显不会有关系,可如果形成了奇环的话那就肯定不是二分图了,而判奇环就只需要维护每个点的深度。
于是,就可以过这题了。
源码
#include<cstdio>
#inclu 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号