Skip to content

2-SAT 学习笔记

SAT 是适定性(Satisfiability)问题的简称。一般形式为 k - 适定性问题,简称 k-SAT。而当 k>2 时该问题为 NP 完全的。所以我们只研究 k=2 的情况。

定义

2-SAT,简单的说就是给出 n 个集合,每个集合有两个元素,已知若干个 a,b,表示 ab 矛盾(其中 ab 属于不同的集合然后从每个集合选择一个元素,判断能否一共选 n 个两两不矛盾的元素。显然可能有多种选择方案,一般题中只需要求出一种即可。

现实意义

比如邀请人来吃喜酒,夫妻二人必须去一个,然而某些人之间有矛盾(比如 A 先生与 B 女士有矛盾,C 女士不想和 D 先生在一起那么我们要确定能否避免来人之间有矛盾,有时需要方案。这是一类生活中常见的问题。

使用布尔方程表示上述问题。设 a 表示 A 先生去参加,那么 B 女士就不能参加(¬ab 表示 C 女士参加,那么 ¬b 也一定成立(D 先生不参加总结一下,即 (ab)(变量 a,b 至少满足一个对这些变量关系建有向图,则有:¬ab¬baa 不成立则 b 一定成立;同理,b 不成立则 a 一定成立建图之后,我们就可以使用缩点算法来求解 2-SAT 问题了。

常用解决方法

Tarjan SCC 缩点

算法考究在建图这点,我们举个例子来讲:

假设有 a1,a2b1,b2 两对,已知 a1b2 间有矛盾,于是为了方案自洽,由于两者中必须选一个,所以我们就要拉两条有向边 (a1,b1)(b2,a2) 表示选了 a1 则必须选 b1,选了 b2 则必须选 a2 才能够自洽。

然后通过这样子建边我们跑一遍 Tarjan SCC 判断是否有一个集合中的两个元素在同一个 SCC 中,若有则输出不可能,否则输出方案。构造方案只需要把几个不矛盾的 SCC 拼起来就好了。

输出方案时可以通过变量在图中的拓扑序确定该变量的取值。如果变量 x 的拓扑序在 ¬x 之后,那么取 x 值为真。应用到 Tarjan 算法的缩点,即 x 所在 SCC 编号在 ¬x 之前时,取 x 为真。因为 Tarjan 算法求强连通分量时使用了栈,所以 Tarjan 求得的 SCC 编号相当于反拓扑序。

显然地,时间复杂度为 O(n+m)

暴搜

就是沿着图上一条路径,如果一个点被选择了,那么这条路径以后的点都将被选择,那么,出现不可行的情况就是,存在一个集合中两者都被选择了。

那么,我们只需要枚举一下就可以了,数据不大,答案总是可以出来的。