2-Sat

\(n\) 个 01 变量,有若干个限制,每个限制对 \(i,j\) 有要求。

对每个变量建立两个点表示两种取值,有向边 \((u,v)\) 表示 \(u\) 选了,则 \(v\) 一定选。

建图方式:

  1. \(x=a\),则 \(y=b\)

那么就是 \(x=a\)\(y=b\)\(y\not=b\)\(x\not=a\)

  1. \(x=a\)\(y=b\)

就是 \(x\not=a\)\(y=b\)\(y\not=b\)\(x=a\)

  1. \(x=a\) 恒成立

直接从 \(x_{a xor 1}-->x_a\) 即可,这样选到另一个取值必然会选到这个取值,因为一个点两个取值不能同时成立,这样选就保证寄掉。

然后构造方案就是对图缩点之后看有没有两个点在同一scc内,有就无解,否则,对缩完点的图拓扑排序,取所在 scc 拓扑序较大的即可构造解。

最小字典序解就必须 dfs 解决了。

对于一些取值较小的限制问题,可以将每个变量拆成 \(V\) 个点,每个点 \(i\) 表示是否 \(\le i\)

posted @ 2023-03-01 17:38  infinities  阅读(17)  评论(0编辑  收藏  举报