概述
首先我们需要知道什么是SAT问题。
有
n
个布尔变量,
是否存在一个方案,我们给这
n
个变量赋合适的值,使得这
k-SAT的含义是这
k≥3
时k-SAT都可以规约到3-SAT问题,3-SAT是NP完全问题,不存在多项式解法。
但是1-SAT或2-SAT是存在多项式解法的。
符号与约定
bool逻辑运算符号
or:
∨
and:
∧
not:
¬
所有的16种bool二元运算都可以用以上三种表示。
如
a xor b=(a∨b)∧(¬a∨¬b)
1-SAT
描述
形如
f=p1∧p2∧p3∧...∧pm
的表达式。
f
的取值是否可能为
p
为一元表达式,可能有两种情况:
1.
2.
¬xi
解决方案
我们只需要判断是否同时存在
xi
和
¬xi
即可。
如果存在,那么一定是不可满足的。
反之,则一定是可满足的的。
2-SAT
描述
形如
f=p1∧p2∧p3∧...∧pm
的表达式。
f
的取值是否可能为
p
为二元表达式,可能有四种情况:
¬xi∨yi
xi∨¬yi
¬xi∨¬yi
解决方案
考虑构建图的模型。
把每个变量的
0,1
取值看拆成两个点。
设
p=x∨y
那么若
x=0
,为了使得这个表达式为
1
,则
就在图中
x0→y1
连边。
同理若
y=0
,则
x=1
,所以
x0→x1
。
如果一个图中的点构成了强连通分量,那么这些点所代表的变量的取值,一定是全部满足的。
所以如果
x0,x1
同时出现在了同一强连通分量,那么
f
必然不可满足。
如果没有这种情况,则必然存在一种方案使得
更一般的情况
上面提到了所有的布尔二元运算都可以转化成
∨∧¬
的表达。
事实上,我们不是一定要将表达式转化为一般形式。
以xor为例。
我们按照若
x
,则
x0→y1
x1→y0
y0→x1
y1→x0
这和拆分后的连边是等价的。
对于实际问题来说,我们也可以用这种方式。
如果出现若选
x
则必然选
算法实现
1.O(N+M)
先依照关系建图。
使用tarjan求出强连通分量。
判断每个变量
0,1
取值是否在一个强连通分量。
主要用于判断是否可满足和求一组可行解。
寻找可行解可以进行拓扑排序+黑白染色。
同色的即为一个可行方案。
2.O(NM)
先依照关系建图。
枚举每个变量的取值,看是否能推出矛盾,如不能,则确定。
如果某个变量两个变量都不可行,则不可满足。
主要用于寻找字典序最小解
按照字典序从小到大的顺序枚举即可。