Address: POJ 3678
It's a 2-SAT question .. You just need to discuss the categories ..
The code is as follows:
# Include <iostream> # include <cstdio> # include <string> # include <cstring> # include <stdlib. h> # include <math. h> # include <ctype. h >#include <queue> # include <map> # include <set> # include <algorithm> using namespace std; # define LL _ int64const int INF = 0x3f3f3f; int head [2100], cnt, index, top, ans; int dfn [2100], low [2100], belong [2100], instack [2100], stak [2100]; struct node {int u, v, next;} edge [10000000]; vo Id add (int u, int v) {edge [cnt]. v = v; edge [cnt]. next = head [u]; head [u] = cnt ++;} void tarjan (int u) {dfn [u] = low [u] = ++ index; instack [u] = 1; stak [++ top] = u; for (int I = head [u]; I! =-1; I = edge [I]. next) {int v = edge [I]. v; if (! Dfn [v]) {tarjan (v); low [u] = min (low [u], low [v]);} else if (instack [v]) {low [u] = min (low [u], dfn [v]) ;}} if (dfn [u] = low [u]) {ans ++; while (1) {int v = stak [top --]; belong [v] = ans; instack [v] = 0; if (u = v) break ;}}} void init () {memset (head,-1, sizeof (head); memset (dfn, 0, sizeof (dfn); memset (instack, 0, sizeof (instack); cnt = ans = top = index = 0;} int main () {int n, m, I, j, a, B, c; char s [10]; while (scanf ("% d % D ", & n, & m )! = EOF) {init (); while (m --) {scanf ("% d % s", & a, & B, & c, s ); if (! Strcmp (s, "AND") {if (c = 0) {add (a <1, B <1 | 1); add (B <1, a <1 | 1) ;}else {add (a <1, B <1); add (B <1, a <1 ); add (a <1 | 1, a <1); add (B <1 | 1, B <1) ;}} else if (! Strcmp (s, "OR") {if (c = 0) {add (a <1 | 1, B <1 | 1 ); add (B <1 | 1, a <1 | 1); add (a <1, a <1 | 1); add (B <1, B <1 | 1);} else {add (a <1 | 1, B <1); add (B <1 | 1, a <1) ;}}else {if (c = 0) {add (a <1 | 1, B <1 | 1 ); add (a <1, B <1); add (B <1 | 1, a <1 | 1); add (B <1, a <1) ;}else {add (a <1 | 1, B <1); add (a <1, B <1 | 1 ); add (B <1 | 1, a <1); add (B <1, a <1 | 1) ;}}for (I = 0; I <n <1; I ++) {if (! Dfn [I]) tarjan (I);} int flag = 0; for (I = 0; I <n; I ++) {if (belong [I <1] = belong [I <1 | 1]) {flag = 1; break ;}} if (flag) puts ("NO"); else puts ("YES");} return 0 ;}
POJ 3678 Katu Puzzle (2-SAT)