2 - SAT 学习笔记
SAT 是适定性(Satisfiability)问题的简称。一般形式为 k - 适定性问题,简称 k-SAT。而当 时该问题为 NP 完全的。所以我们只研究 的情况。
定义
2 - SAT,简单的说就是给出 个集合,每个集合有两个元素,已知若干个 ,表示 与 矛盾(其中 与 属于不同的集合
现实意义
比如邀请人来吃喜酒,夫妻二人必须去一个,然而某些人之间有矛盾(比如 A 先生与 B 女士有矛盾,C 女士不想和 D 先生在一起
使用布尔方程表示上述问题。设 表示 A 先生去参加,那么 B 女士就不能参加(
常用解决方法
Tarjan SCC 缩点
算法考究在建图这点,我们举个例子来讲:
假设有 和 两对,已知 和 间有矛盾,于是为了方案自洽,由于两者中必须选一个,所以我们就要拉两条有向边 和 表示选了 则必须选 ,选了 则必须选 才能够自洽。
然后通过这样子建边我们跑一遍 Tarjan SCC 判断是否有一个集合中的两个元素在同一个 SCC 中,若有则输出不可能,否则输出方案。构造方案只需要把几个不矛盾的 SCC 拼起来就好了。
输出方案时可以通过变量在图中的拓扑序确定该变量的取值。如果变量 的拓扑序在 之后,那么取 值为真。应用到 Tarjan 算法的缩点,即 所在 SCC 编号在 之前时,取 为真。因为 Tarjan 算法求强连通分量时使用了栈,所以 Tarjan 求得的 SCC 编号相当于反拓扑序。
显然地,时间复杂度为 。
暴搜
就是沿着图上一条路径,如果一个点被选择了,那么这条路径以后的点都将被选择,那么,出现不可行的情况就是,存在一个集合中两者都被选择了。
那么,我们只需要枚举一下就可以了,数据不大,答案总是可以出来的。