更多文章可以在本人的个人小站:https://kaiserwilheim.github.io 查看。
转载请注明出处。
2-SAT问题的名字可以拆成两部分:2和SAT。
SAT?
SAT是Satisfiability【可满足性】的简称。
解释一下,就是,我们有若干个需要赋值的布尔变量,要求对这些变量进行赋值,使得这些变量的值满足一组布尔方程。
举个例子:
宝硕需要讲解一个题目,他需要就着代码讲题,所以代码需要让每一个人看懂,并尽量满足每一个人的代码习惯。
听的人有三个:KaiserWilheim、Johnsonloy、JeffZhao。现在他们提出了一些要求,如下:
- KaiserWilheim要求代码满足下列条件之一:
- 使用bits库 ( a a a)
- 不使用
#define int long long
( ¬ b \neg b ¬b) - 大括号换行 ( c c c)
- Johnsonloy要求代码满足下列条件之一:
- 使用bits库 ( a a a)
- 使用
#define int long long
( b b b) - 大括号换行 ( c c c)
- JeffZhao要求代码满足下列条件之一:
- 不使用bits库 ( ¬ a \neg a ¬a)
- 不使用
#define int long long
( ¬ b \neg b ¬b) - 大括号不换行 ( ¬ c \neg c ¬c)
我们可以将三种条件分别设为 a a a, b b b, c c c,变量前加 ¬ \neg ¬ 表示对当前要求表示否定。
那么上述要求可以变为 ( a ∨ ¬ b ∨ c ) ∧ ( a ∨ b ∨ c ) ∧ ( ¬ a ∨ ¬ b ∨ ¬ c ) (a \lor \neg b \lor c)\land(a \lor b \lor c)\land(\neg a \lor \neg b \lor \neg c) (a∨¬b∨c)∧(a∨b∨c)∧(¬a∨¬b∨¬c)。其中 ∨ \lor ∨ 表示或, ∧ \land