跳转至

2-SAT

1341. 2-SAT

对于一系列形如 \((x_i=a) \lor (x_j=b)\) 的约束,其中 \(a,b\in \{0,1\}\),你需要判断是否存在一组 \(\{x_i\}\) 使其同时满足。如果有,请输出一组解。

限制:\(1 \leq n, m \leq 10 ^ 6\)

如何建图?

我们考虑两个命题 \(p, q\)

  • 如果有 \(p\rightarrow q\), 那么有 \(\neg q \rightarrow \neg p\)
  • 如果有 \(p\leftrightarrow \neg p\),那么无解。
  • 我们考虑把每个变量表示为图上的两个点,其中一个点代表这个变量取 0,另一个点代表这个变量不取 0(也即取 1),把命题表示为变量之间的有向边。
  • 存在 \(p\leftrightarrow \neg p\) 时,命题无解,此时图两个点之间存在一定关系。否则,我们声称一定有解。
应该如何存储这个图?

应当使用邻接表,邻接矩阵存不下。

如果你实在想使用邻接矩阵,也应当使用 unordered_map 优化空间。

数组开两倍

一个点会被拆成真和假两个点;两个命题之前构成的关系也需要需要添加其逆否。

同时,注意使用的标号范围,特别是 0 号点和 1 号点。

如何构造一组解?
  • 考虑如果 \(p\)\(q\) 本身是矛盾的,比如 \(p : x=0\), \(q : x = 1\)。如果有 \(p\rightarrow q\),也即 \(p\) 必为假,\(q\) 必为真。

    也就是说,\((x=0)\rightarrow (x = 1)\) 表示此刻 \(x\) 必然不可能为 \(0\)

  • 如何在解中体现 \(p \rightarrow \neg p\) 时取到 \(\neg p\)