Poj 3678 Katu puzzle
Question Link
Question: Based on those expressions, it is impossible to construct a solution.
Idea: basically 2-Sat, convert all expressions into 2-SAT forms.
Code:
#include <cstdio>#include <cstring>#include <cstdlib>#include <vector>#include <algorithm>using namespace std;const int MAXNODE = 2005;struct TwoSet {int n;vector<int> g[MAXNODE * 2];bool mark[MAXNODE * 2];int S[MAXNODE * 2], sn;void init(int tot) {n = tot * 2;for (int i = 0; i < n; i += 2) {g[i].clear();g[i^1].clear();}memset(mark, false, sizeof(mark));}void add_Edge(int u, int uval, int v, int vval) {u = u * 2 + uval;v = v * 2 + vval;g[u^1].push_back(v);g[v^1].push_back(u);}bool dfs(int u) {if (mark[u^1]) return false;if (mark[u]) return true;mark[u] = true;S[sn++] = u;for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (!dfs(v)) return false;}return true;}bool solve() {for (int i = 0; i < n; i += 2) {if (!mark[i] && !mark[i + 1]) {sn = 0;if (!dfs(i)) {for (int j = 0; j < sn; j++)mark[S[j]] = false;sn = 0;if (!dfs(i + 1)) return false;}}}return true;}} gao;int n, m;int a, b, c;char op[10];int main() {while (~scanf("%d%d", &n, &m)) {gao.init(n);while (m--) {scanf("%d%d%d%s", &a, &b, &c, op);if (op[0] == 'A') {if (c == 1) {gao.add_Edge(a, 1, a, 1);gao.add_Edge(b, 1, b, 1);} else gao.add_Edge(a, 0, b, 0);}if (op[0] == 'O') {if (c == 0) {gao.add_Edge(a, 0, a, 0);gao.add_Edge(b, 0, b, 0);} else gao.add_Edge(a, 1, b, 1);}if (op[0] == 'X') {if (c == 1) {gao.add_Edge(a, 0, b, 0);gao.add_Edge(a, 1, b, 1);}else {gao.add_Edge(a, 0, b, 1);gao.add_Edge(a, 1, b, 0);}}}printf("%s\n", gao.solve() ? "YES" : "NO");}return 0;}
Poj 3678 Katu puzzle (2-Sat)