2-SAT
2-SAT一般给出nn个布尔变量(取0或者取1),再给出个关于这些布尔变量的约束条件(见下文),求出是否能找到解满足这些约束条件。
2-SAT可以建图,转换成强连通分量进而判断矛盾问题。对于布尔变量,只有2个取值,取0或者取1,所以对于任意一个布尔变量xixi,我们可用其原变量ii(即取1值)和其反变量(即取0值)依据约束条件来构建图。
约束条件
我们以变量xi、xjxi、xj为例,i、ji、j表示原变量,i′、j′i′、j′表示反变量。一般来说,2-SAT约束条件有以下几种。
- 必须xixi.
- 必不选xixi。
- xixi与xjxj中选择一个。
- xixi与xjxj不都选。
- xixi与xjxj选择情况相同。
- xixi与xjxj选择情况相反。
下面依次看这几种约束条件的构图。
- 必选xixi。等价于xi=1xi=1。此种选择方法有多种构图的形式,其中一种就是我们不连边,最后看xixi是否等于1,或者说当xixi等于1时是否存在解。还有一种方法是我们连一条i′−ii′−i的边。其意思为当我们推断出xixi为0的时候,那么xixi一定为1。由于我们判断是否有解是根据强连通分量来的,所以这样的连边并不矛盾。
- 必选xixi。等价于xi=0xi=0。连i−i′i−i′的边即可。
- xixi与xjxj中选择一个。等价于xi∨xj=1xi∨xj=1。连边i′−j、j′−ii′−j、j′−i。
- xixi与xjxj不都选。等价于xi∧xj=0xi∧xj=0。连边i−j′、j−i′i−j′、j−i′。
- xixi与xjxj选择情况相同。等价于xi XOR xj=0xi XOR xj=0。连边i−j、j−i、i′−j′、j′−i′i−j、j−i、i′−j′、j′−i′。
- xixi与xjxj选择情况相反。等价于xi XOR xj=1xi XOR xj=1。连边i−j′、j−i′、i′−j、j′−ii−j′、j−i′、i′−j、j′−i。
判定与解的输出
构图完成之后,即可进行有解性判定。
使用tarjan算法求出强连通分量并染色,如果有一个布尔变量的原变量和反变量在一个scc中,那么原问题无解,否则一定存在解。
若求任意解,则对染色后的图重新建图,但是把边反向,统计入度,做拓扑排序,同时求出每个点反变量的颜色。之后按照拓扑排序的顺序,依次将对应scc标记为1以表示选中,其反变量对应的scc标记为2以表示不选中(也表示其反变量选中)。最后遍历一遍布尔变量的原变量和反变量:若变量所在的scc被标记为1,则表明选中变量;否则表示其另外一个变量被选中。
若求字典序最小的解,也使用标记法。对所有变量进行遍历,若 xixi 其原变量和反变量都没进行标记过,则dfs进去优先标记 xixi 的原变量,并根据他们连过的边,继续dfs标记。如果标记的过程中,某个变量的原变量和反变量同时被标记,则表示选中xixi的原变量无解,进而选中xixi的反变量继续标记。若在遍历过程中,发现无论标记某个遍历的原变量和反变量都无解,表示整个2-SAT无解。否则标记的就是字典序最小的解。