2-SAT
一、SAT问题以及2-SAT问题的定义
在了解2-SAT的定义之前,我们需要给出一些基础定义。
布尔变量(Boolean variable):只能取1(true)或0(false)的变量。
否定连接词\(\neg\)(negation):布尔变量的否定。例如\(\neg 1 = 0\),\(\neg 0 = 1\)。\(\neg(\neg a) = a\)。
合取连接词\(\land\)(conjunction):表示“且”。\(a \land b = 1\)当且仅当\(a,b\)同时为1。
析取连接词\(\lor\)(disjunction):表示“或”。\(a \lor b = 1\)当且仅当\(a,b\)之中至少有一个为1。
蕴含连接词\(\rightarrow\)(implication):\(a \rightarrow b\)等价于\(\neg a \lor b\)。\(a \rightarrow b = 1\)当且仅当\(a = 0\)或\(b = 1\)。换言之,若\(a = 1\),则必有\(b = 1\),否则蕴含关系不成立;若\(a = 0\),则不论\(b\)取何值,蕴含关系都成立。
文字(literal):变量\(x\)及其否定\(\neg x\)称为文字。
子句/简单析取式(clause):若干个文字由析取连接词连接起来形成的布尔表达式称为简单析取式。例如\(a \lor b \lor \neg c\),\(\neg d \lor d \lor e \lor \neg f\)。
合取范式(CNF, Conjunctive Normal Form):若干个简单析取式由合取连接词连接起来形成的布尔表达式称为合取范式(即“简单析取式的合取”)。例如\((p \lor \neg q) \land (\neg p \lor r \lor s) \land \neg r \land (s \lor \neg s)\),它有四个子句。
2-CNF:每个子句仅包含两个文字的合取范式。例如\((a \lor \neg b) \land (b \lor c) \land (c \lor \neg f) \lor (\neg d \lor e)\)。
布尔表达式的可满足性:对于一个布尔表达式,如果存在各变量的一组赋值,使得该表达式的值为1,则称该表达式是可满足的。对于合取范式,因为各子句之间是且的关系,所以要使它取值为1就必须使各子句取值都为1。
对于上面给出的式子\((a \lor \neg b) \land (b \lor c) \land (c \lor \neg f) \lor (\neg d \lor e)\),令\(a = 1, b = 1, c = 1, d = 0, e = 0, f = 1\)可以使其取值为1,所以它是可满足的;但对于式子\((a \lor \neg b) \land (b \lor c) \land (b \lor \neg c) \land (\neg a \lor \neg b)\),不论\(a,b,c\)取何值,式子的值都是0,因此它是不可满足的。
2-SAT:也称2-CNF-SAT,是判断2-CNF是否可满足的问题。(判断一般的合取范式是否可满足的问题是NP完全问题,至今没有发现多项式时间的算法;但2-SAT是一个特例,具有高效算法。)
二、实际问题
P4782 【模板】2-SAT
题目描述
有 \(n\) 个布尔变量 \(x_1\sim x_n\),另有 \(m\) 个需要满足的条件,每个条件的形式都是 「\(x_i\) 为 true / false 或 \(x_j\) 为 true / false」。比如 「\(x_1\) 为真或 \(x_3\) 为假」、「\(x_7\) 为假或 \(x_2\) 为假」。
2-SAT 问题的目标是给每个变量赋值使得所有条件得到满足。

浙公网安备 33010602011771号