2-Sat
有 \(n\) 个 01 变量,有若干个限制,每个限制对 \(i,j\) 有要求。
对每个变量建立两个点表示两种取值,有向边 \((u,v)\) 表示 \(u\) 选了,则 \(v\) 一定选。
建图方式:
- \(x=a\),则 \(y=b\)
那么就是 \(x=a\) 时 \(y=b\),\(y\not=b\) 时 \(x\not=a\)。
- \(x=a\) 或 \(y=b\)
就是 \(x\not=a\) 时 \(y=b\),\(y\not=b\) 时 \(x=a\)。
- \(x=a\) 恒成立
直接从 \(x_{a xor 1}-->x_a\) 即可,这样选到另一个取值必然会选到这个取值,因为一个点两个取值不能同时成立,这样选就保证寄掉。
然后构造方案就是对图缩点之后看有没有两个点在同一scc内,有就无解,否则,对缩完点的图拓扑排序,取所在 scc 拓扑序较大的即可构造解。
最小字典序解就必须 dfs 解决了。
对于一些取值较小的限制问题,可以将每个变量拆成 \(V\) 个点,每个点 \(i\) 表示是否 \(\le i\)。