问题定义
SAT(satisfiability / 适定性问题):对于一个合取范式,求解使得该合取范式的值为1。
a and (b or c) and (d or e or f) and ... 2-SAT:该合取范式的每一个子式只包含两个变量。
(a or b) and (c or d) and (e or f) and ... 2-SAT算法
构造有向图G。构造方法:
合取范式中的每个变量衍生两个顶点:0和1(即:a=0, a = 1, b = 0, b = 1 ...)。 说明:为了方便起见,下文将a = 0的点简写为a0,a = 1的点简写为a1,以此类推。
合取范式中的每个子式衍生两条有向边:例如,由(a or b)得到a0 -> b1、b0 -> b1,意为若a为0则b必须为1,若b为0则a必须为1。 求解步骤1中得到的有向图的强连通分量。如果存在某变量x,由该变量衍生的两个顶点x0和x1位于同一强连通分量上,则问题无解;否则将位于同一强连通分量上的点缩为一个点,得到新的有向图G'。
将步骤2中得到的有向图的边反向,得到有向图G''。
将步骤3中得到的有向图的顶点G''置为“未着色”状态,按照拓扑顺序重复以下操作:
选择第一个未着色的顶点X,将X染成红色。
把所有与X矛盾的顶点Y及其子孙全部染成蓝色。(G''中某顶点X的矛盾点的定义:G中存在x0(或x1)属于X,x1(或x0)属于Y,则Y为X的矛盾点)
重复操作1和2,直到不存在未着色的点为止。
G''中被染成红色的点在图G中对应的顶点的集合,即为该2-SAT问题的一组解。