2-sat相关复习

noi曾经考过,谁能说得准呢

sat问题

通俗的sat问题表述一般是这样的:有很多个集合,每个集合里面有若干元素,现给出一些取元素的规则,要你判断是否可行,可行则给出一个可行方案。如果所有集合中,元素个数最多的集合有k个,那么我们就说这是一个k-sat问题。
k-sat是NP问题,当k>2时,所以在OI里,我们只讨论2-sat问题的解决。

能干啥

一般形式(模板):n个点,每个点有个01变量,给出m个限制,让你找出符合限制的一组合法解
限制条件一般为\(x_{0} \oplus {y_{0}}=0,x_1\&y_0=1\)之类的.

如何做

我们利用限制条件来构出图来
一个限制条件如果是 \(a\)则必须选\(b\)
那么,
\(a -> b\)(显性条件)
\(b' -> a'\)(隐性条件)
就是说第一条边就是限制条件所说。
第二条边就是说选了\(b'\),则再选择了\(a\)会与条件矛盾,所以只能选择\(a'\)
这样我们构出的图就有对称性了
2-sat的构图总是有对称性的

判定&&求解

举例子
选1不选4,选2不选3,选7不选3
dsr
我们首先选1,则3,8是必须选的(4,7必须不选),5,6随便选一个
矛盾的情况就是一个组都选了(上下两个点)
然后枚举一组没有确定过的点,进行判定,如果矛盾,则选另一个a',不矛盾就选择a。
得不到答案无解,得到就是一组解
为何上面没被确定的点就可以继续判定,
也就是说这组点没有被之前的点所连,他们与之前的组是没有关系的(边即关系)
这也是得到一组字典序最小解的方法(应该是求字典序最小的唯一方法)
复杂度\(O(n*m)\)

优化求解(利用对称性)

我们发现,一个环内,要不都不要,要不都要,就是说这些点都可以用一个点表示
喂喂喂,你别忘了这是2-sat问题诶,你一个点要有两个属性诶,缩点了如何保证啊。
emm,不用管。
我们之前建边的对称有啥用呢?
如果一个环是a->b->c->d->e->a
那么根据前面建边的对称,一定有a'<-b'<-c'<-d'<-e'<-a'
那么我们就说这两个环对称
那么我们建立的新图自然就是对称的,也就保证了2-sat的两个属性。

环内如果一组都在里面,则无解(因为两个点必须有一个选和一个不选)。
那么我们先tarjan缩下点,判一下无解

我们选择了一个点,则它的所有连接着的点都要被选(还有连接着的连接着的点……),很麻烦
那我们先找入读为0的点,这么就没影响了。
就是拓扑排序,不过拓扑的是反图(边都反过来)。
不过tarjan的时候就是按拓扑序来的,所以根本不用再在写拓扑了(写也没关系啦),嘻嘻。