2-SAT

前言

其实是一种常用的建图方式。部分内容参考一本通。

算法讲解

简介

2-SAT 问题描述为:给出 $n$ 个布尔变量,每个变量只能取 $0/1$,再给出 $m$ 个约束条件,每个约束条件限制了两个变量的关系,要求找出一组满足所有约束条件的取值方案。
当布尔变量为真时我们称其为原变量,反之为反变量。对于任意一个布尔变量 $x_i$,我们可以用原变量 $i$ 和其反变量 $i’$ 根据约束条件建出有向图,再进行强连通分量并重新建图,进而判断是否有解。

构图

  1. $x_i=1$
  2. $x_i=0$
  3. $x_i\vee x_j=1$(即必有一个为真)
  4. $x_i\wedge x_j=0$(即必有一个为假)
  5. $x_i XOR x_j=0$
  6. $x_i XOR x_j=1$

依次考虑这几种约束条件的构图:

  1. 必选 $i$,此种选择方法有多种构图的形式,其中一种就是我们不连边,最后检查 $x_i$ 是否为真,或者说当 $x_i$ 为真时是否存在解。还有一种方法是我们连一条 $i’\rightarrow i$ 的边。其意思为当我们推断出 $x_i$ 为假的时候,$x_i$ 又必须为真。这样连边相当于强制了 $x_i$ 的选择。
  2. 必选 $i’$。同理,连 $i\rightarrow i’$ 的边。
  3. $i$ 与 $j$ 中至少选择一个,等价于 $xi\vee xj=1$。连边 $i’\rightarrow j$、$j’\rightarrow i$,表示不选 $i$ 就一定要选 $j$,不选 $j$ 就一定要选 $i$。
  4. $i$ 与 $j$ 不都选,等价于 $x_i XOR x_j=0$。连边 $i\rightarrow j’$、$j\rightarrow i’$,表示选了 $i$ 就一定不选 $j$,选了 $j$ 就一定不选 $i$。
  5. 等价于 $x_iXORx_j=0$。连边 $i\rightarrow j$、$j\rightarrow i$、$i\rightarrow j’$、$j’\rightarrow i’$。
  6. 等价于 $x_iXORx_j=1$。连边 $i\rightarrow j’$、$j\rightarrow i’$、$i’\rightarrow j$、$j’\rightarrow i$。

证明与思考

主要是图的对称性传递性

对称性

这里的对称指的是逆否命题的对称,即若存在 $i\rightarrow j$ 的边,则一定存在 $j’\rightarrow i’$ 的边,我们称这两条边互为对称边。
不难发现,对称性在建图是已经体现出来。对于 $i\rightarrow i’$ 这样的边,对称边还是自己,仍然满足对称性。

传递性

若有 $i\rightarrow j,j\rightarrow k$,则可得出 $i\rightarrow k$。
由此我们求出来的强连通分量也有对称性。

判定与方案

判定

对于一个变量 $x_i$,我们称 $i$ 与 $i’$ 是矛盾的。
使用 tarjan 算法缩点,如果 $i$ 与 $i’$ 在同一个强连通分量中,则原问题无解,否则无解。

方法

性质:对于建好的图在所选择的集合中任意一个点 $x_i$,点 $x_i$ 的所有后继都应该被选。
那考虑这样构造答案:
我们按照拓扑序从后往前考虑每个强连通分量是否选取,能够避免“选了 $i$ 却发现 $i’$ 在 $i$ 的后继中”的尴尬情况。
其实实现并没有那么麻烦,回顾 tarjan 算法,我们是在回溯的过程中求得强连通分量,所以求强连通分量的顺序就是拓扑逆序。所以我们不用真的求拓扑序。

方案 1

缩点时直接判断当前强连通分量是否能被选取,如果内部没有矛盾且所有点都是可选的,同时设置矛盾点不可选。那么这样选取实际上是遵循了拓扑逆序。

方案 2

按照求强连通分量的顺序给每个强连通分量编号。结束缩点后,对于一堆互相矛盾的点,选择编号较小的那一个(等价于拓扑逆序较小的,即拓扑序从后往前),本质上也遵循了拓扑逆序。

Code(模板)

例题

P4782 【模板】2-SAT

link,模板。

P4171 [JSOI2010] 满汉全席

link,约等于模板。

P5782 [POI2001] 和平委员会

link,也是板。

P3007 [USACO11JAN] The Continental Cowngress G

link,比较有意思,但是数据不够强,支持 $O(n^2)$。
首先正常建边,然后判定也比较好写。主要是是否必要的判断感觉上不太友好。
转化一下:
“?”:通过合法,驳回也合法。
“Y”:只有通过合法。
“N”:只有驳回合法。
那么直接选取这个点,通过判断它的后继中是否有矛盾即可。复杂度 $O(n^2)$。

P3209 [HNOI2010] 平面图判定

link,需要一点前置芝士。
首先跟据欧拉公式($|V|+|R|-|E|=2$)和平面图定理($m\leq n\times 3+6$),先将边数缩减到 $O(n)$ 级别。
然后把点的编号转化为哈密顿回路中的顺序编号,同时判断哪两条边相交(对于边 $i,j$ 判断相交:$x_i<x_j<y_i<y_j$)。
由于边可以放在哈密顿回路内部,也可以放在外部,那么既可以用种类并查集做,也可以用 $2-SAT$ 做,最后判断是否存在合法解即可。