codeforces Lenient Vertex Cover 题解
F. Lenient Vertex Cover
题目描述:
给一个无向连通图黑白染色,需要满足至多存在一条边两边颜色相同,\(|V|,|E|\leq 10^6\)。
题解:
一个图可以黑白染色满足每条边两边颜色不同的充要条件是不存在奇环。
那么原题就是询问是否可以删除一条边使得剩下的图不存在奇环,也就是询问是否所有奇环经过同一条边。
首先对原图建出dfs树,对于一条反祖边\((u,v)\),如果\((depth[u]-depth[v])\mod 2=0\),则从\(u\)到\(v\)的路径和反祖边构成了一个奇环。
如果只有一条这样的反祖边,则删除这条反祖边后就不存在奇环,否则删除的边一定是树边。
将\(u\)到\(v\)的路径都打上一个标记,那么如果不存在一条边被所有这样的反祖边覆盖,则一定无解。
但是可能会存在一个奇环和一个偶环组合成一个奇环:
可以看成如果有一条树边被一个偶数反祖边覆盖,则可以通过这个偶数反祖边跳过这条树边,也就是这条树边不一定存在所有的奇环中。
实现的时候可以用树上差分,对于奇数的反祖边将\(u\)到\(v\)的路径上\(tag1\)加上1,偶数的反祖边将\(u\)到\(v\)的路径上\(tag0\)加上1。
假设有k条奇数反祖边,那么一条边删除后不存在奇环的充要条件是\(tag1[e]=k,tag0[e]=0\),删除时候跑一边二分图染色就是方案。
时间复杂度为\(O(N)\)。