2-SAT

是什么?

\(n\) 个变量,每个变量取 0 \(or\) 1 表示取或不取,满足一些约束

  • \(a\ xor\ b = 1\)\(a\)\(b\) 有一个选,一个不选
  • \(a\ xor\ b = 0\)\(a\)\(b\) 要么都选,要么都不选
  • \(a\ or\ b = 1\)\(a\)\(b\) 至少选一个
  • \(a\ or\ b = 0\)\(a\)\(b\) 都不能选
  • \(a\ and\ b = 1\)\(a\)\(b\) 必须都选
  • \(a\ and\ b = 0\)\(a\)\(b\) 可以选一个或者不选

怎么做?

我们把一个点拆成两个,\(x, \neg x\)
考虑上面的关系,如果选 \(a\) 必须选 \(b\) 的话就从 \(a\)\(b\) 连一条边
比如 \(a\ xor\ b = 1\),选 \(a\) 就必须选 \(\neg b\),选 \(b\) 就必须选 \(\neg a\) 所以连边 \((a, \neg b), (\neg a, b), (b, \neg a), (\neg b, a)\)

其他关系同理,这里列出

  • \(a\ xor\ b = 1\)\((a, \neg b), (\neg a, b), (b, \neg a), (\neg b, a)\)
  • \(a\ xor\ b = 0\)\((a, b), (\neg a, \neg b)\)
  • \(a\ or\ b = 1\)\((\neg a, b), (\neg b, a)\)
  • \(a\ or\ b = 0\)\((a, \neg a), (b, \neg b)\)
  • \(a\ and\ b = 1\)\((\neg a, a), (\neg b, b)\)
  • \(a\ and\ b = 0\)\((a, \neg b), (b, \neg a)\)

连完边后,\(tarjan\) 求强联通分量,如果 \(x\)\(\neg x\) 在同一个强联通分量里,则无解,否则必有至少一组解

对于 \(x\) 必选连边 \((\neg x, x)\)\(x\) 必不选连边 \((x, \neg x)\) 你可能有些疑惑,接下来看了如何求解就没了

首先缩点,在同一个强连通分量里的点要选必须一起选,然后对缩完点后的 \(DAG\) 求一个拓扑序

考虑 \(a \to b\) 表示 \(a\) 能到达 \(b\),也就是选 \(a\) 必须选 \(b\)
如果 \(a\)\(\neg a\) 不联通,那它们随便取
如果 \(a \to \neg a\)\(\neg a\) 不冲突
如果 \(\neg a \to a\)\(a\) 不冲突

求出拓扑序后,如果 \(\neg a\)\(a\) 前面则选 \(a\) 否则选 \(\neg a\),这样为什么是对的呢 ?
观察上面的边,发现他们是对偶的,如果 \(a\)\(b\) 在同一个强联通分量中,那么 \(\neg a\)\(\neg b\) 一定在一起

  • 例题 POI 2011 Consprirary

没了

posted @ 2020-06-06 11:29  __int256  阅读(96)  评论(0编辑  收藏  举报