Loading

2-SAT 速通

2026 upd:2-SAT 前面的东西给删了,只留下了这部分。调整文字表述,现在更加简洁易懂。

SAT 问题是一类特殊的 bool 方程,包含 bool 变量 \(p_1,p_2,\cdots,p_n\) 与若干个需要满足的条件。条件的形式全部形如 (\(p_{a_1}\) 为真/假) 或 (\(p_{a_2}\) 为真/假) 或 \(\cdots\) 或 (\(p_{a_k}\) 为真/假),即对于每个条件, 至少要有一个 \(p_{a_i}\) 为 真/假 要被满足。取条件中最大的 \(k\),称问题为 k-SAT 问题。

可以证明,\(k\geqslant3\) 时 k-SAT 问题是 NPC 问题;但 2-SAT 问题则可线性求解。

具体地,对于 2-SAT 问题,bool 变量 \(p_1,p_2,\cdots,p_n\) 满足的条件是以下五种之一:

  1. \(p_i\) 为真
  2. \(\lnot p_i\) 为真, 即 \(p_i\) 为假
  3. \(p_i\lor p_j\) 为真, 即两变量的或为真
  4. \(\lnot p_i \lor p_j\) 为真
  5. \(\lnot p_i\lor\lnot p_j\) 为真

2-SAT 的技巧在于把这些条件写成蕴含式,包含其逆否命题.

  1. \(\lnot p_i\Rarr p_i\)
  2. \(p_i\Rarr\lnot p_i\)
  3. \(\lnot p_i\Rarr p_j, \lnot p_j\Rarr p_i\)
  4. \(p_j\Rarr p_i, \lnot p_i\Rarr \lnot p_j\)
  5. \(p_i\Rarr\lnot p_j, p_j\Rarr\lnot p_i\)

蕴含式的推导对应图上的连通性。建立 \(2n\) 个点表示 \(p_1,\cdots,p_n\) 和 \(\lnot p_1,\cdots,\lnot p_n\) 按蕴含式连边,强连通分量内的命题等价。若 \(p_i\) 和 \(\lnot p_i\) 在同一个强连通分量里, 则原方程显然无解;否则可以构造出解。

考虑构造。最简单的情况 \(\lnot p_i\rightsquigarrow p_i\),有 \(p_i\) 为真。一般地,构造时选择拓扑序大的一个为真。正确性容易证明:假设存在 \(\lnot p_i\rightsquigarrow p_i,\lnot p_j\rightsquigarrow p_j\), 但 \(p_i\rightsquigarrow \lnot p_j\),则考虑逆否命题 \(p_j\rightsquigarrow\lnot p_i\),与拓扑序的大小关系矛盾. 因此 \(p_i\rightsquigarrow \lnot p_j\) 不可能存在, 我们构造出的是一组合法解.

P4782 【模板】2-SAT 问题

一个小技巧: tarjan 染色会同时求出拓扑序, 不用再跑一遍.

1. luoguP4171 [JSOI2010] 满汉全席

板子题。

2. luoguP3825 [NOI2017] 游戏

注意到 x 的数量并不多, 考虑暴力枚举.
但是枚举是 AB, AC 还是 BC 时间复杂度就直接变成 \(O(3^d(n+m))\), 寄.
但实际上枚两种就够了, 比如枚举 AB 和 AC. 因为这已经包含了这个位置选择 A, B, C 是否可行.
时间复杂度 \(O(2^d(n+m))\).

posted @ 2022-11-23 00:30  pjykk  阅读(105)  评论(0)    收藏  举报