并查集
提供一种只需使用并查集的好写的方法。
统一蓝和统一红只有一个取反的差别,以下默认全部统一为蓝。
一条蓝边,它的两个端点要么都选,要么都不选。
一条红边,它的两个端点只选择其中之一。
于是对每个点建立两个事件“它选”和“它不选”,可以用诸如 $i,i+n$ 的一类方法记录,以下以 $i$ 表示选,$i+n$ 表示不选。
按照上面的条件,设一条边两个端点为 $(u,v)$。可以发现:
一条蓝边,加入无向边 $(u,v),(u+n,v+n)$。
一条红边,加入无向边 $(u,v+n),(u+n,v)$。
到了这一步,大部分题解使用了 $\rm 2-SAT$ 判定。
但其实这些条件都是双向的,并查集就可以实现判断,一个连通块内的事件必须同时发生。
于是贪心地选择一下操作最少连通块就好了,甚至不用建图,也没有啥细节。
代码:
1 | #include<bits/stdc++.h> |

