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
没了