[POJ3678] Katu Puzzle | 2-SAT 入门

简介: DescriptionKatu Puzzle is presented as a directed graph G ( V , E ) with each edge e ( a , b ) labeled by a boolean operator op (oneofAND,OR,XOR) and an integer c ( 0 ≤ c ≤ 1 ) . One Katu is solvable if one can find each vertex Vi a value X i ( 0 ≤ X i ≤ 1 )

Description


Katu Puzzle is presented as a directed graph G ( V , E )  with each edge e ( a , b )  labeled by a boolean operator op (oneofAND,OR,XOR) and an integer c ( 0 ≤ c ≤ 1 ) . One Katu is solvable if one can find each vertex  Vi a value X i ( 0 ≤ X i ≤ 1 ) such that for each edge e(a, b) labeled by op and c, the following formula holds:


Xa op Xb = c


The calculating rules are:


AND 0 1

0 0 0

1 0 1

OR 0 1

0 0 1

1 1 1

XOR 0 1

0 0 1

1 1 0

Given a Katu Puzzle, your task is to determine whether it is solvable.


Input


The first line contains two integers N ( 1 ≤ N ≤ 1000 )and M,( 0 ≤ M ≤ 1 , 000 , 000 ) (0 ≤ M ≤ 1,000,000) indicating the number of vertices and edges.

The following M lines contain three integers a ( 0 ≤ a < N ) , b ( 0 ≤ b < N ), c and an operator op each, describing the edges.


Output


Output a line containing “YES” or “NO”.


Sample Input


4 4
0 1 1 AND
1 2 1 OR
3 2 0 AND
3 0 0 XOR


Sample Output


YES


Hint


X0 = 1, X1 = 1, X2 = 0, X3 = 1.

int n, m;
struct node {
  int to,nex;
} e[maxm << 2];
int cnt = 0, head[maxn << 1];
bool inStk[maxn << 1];
int low[maxn << 1], dfn[maxn << 1],dfc, pos[maxn << 1];
void init() {
  dfc = cnt = 0;
  for(int i=0; i <=2* n; i++) {
    head[i] = -1;
    low[i] = dfn[i] = 0;
  }
}
stack<int> stk;
void add(int u,int v) {
  e[cnt].to = v;
  e[cnt].nex = head[u];
  head[u] = cnt ++;
}
int cntSCC;
void Tarjan(int u) {
//  cout << u << endl;
  dfn[u] = low[u] = ++ dfc;
  inStk[u] = 1;
  stk.push(u);
  for(int i=head[u]; ~i; i=e[i].nex) {
    itn to = e[i].to;
    if(!dfn[to]) {
      Tarjan(to);
      low[u] = min(low[u],low[to]);
    } else if(inStk[to] && !pos[to]) {
      low[u] = min(low[u],dfn[to]);
    }
  }
  if(low[u] == dfn[u]) {
    int tp;
    ++ cntSCC;
    do {
      tp = stk.top();
      stk.pop();
      inStk[tp] = 0;
      pos[tp] = cntSCC;
    } while(tp != u);
  }
}
int a,b,c;
string op;
int main() {
  n=read,m=read;
  init();
  for(int i=1; i<=m; i++) {
    a = read,b = read,c = read;
    cin >> op;
    int u=a * 2,u1=2 * a+1;
    int v=b * 2,v1=2 * b+1;
    if(op == "AND") {
      if(c == 1) {/// u,v
        add(u1,u);
        add(v1,v);
      } else {
//        add(u,u1);
        add(u,v1);
//        add(v,u1);
        add(v,u1);
      }
    } else if(op == "OR") {
      if(c == 1) {
//        add(u1,u);
        add(u1,v);
//        add(v1,v);
        add(v1,u);
      } else {
        add(u,u1);
        add(v,v1);
      }
    } else if(op == "XOR") {
      if(c == 1) {
        add(u,v1);
        add(v,u1);
        add(u1,v);
        add(v1,u);
      } else {
        add(u,v);
        add(v,u);
        add(u1,v1);
        add(v1,u1);
      }
    }
  }
  for(int i=0; i <= 2*n; i++) {
    if(!dfn[i]) Tarjan(i);
  }
  for(int i=0; i <= 2*n; i++) {
    if(pos[i] == pos[i+1]) {
      puts("NO");
      return 0;
    }
    i ++;
  }
  puts("YES");
  return 0;
}


目录
相关文章
POJ3678——Katu Puzzle(2-SAT)
POJ3678——Katu Puzzle(2-SAT)
98 0
POJ3678——Katu Puzzle(2-SAT)
[POJ3678] Katu Puzzle | 2-SAT 入门
Description Katu Puzzle is presented as a directed graph G ( V , E ) with each edge e ( a , b ) labeled by a boolean operator op (oneofAND,OR,XOR) and an integer c ( 0 ≤ c ≤ 1 ) . One Katu is solvable if one can find each vertex Vi a value X i ( 0 ≤ X i ≤ 1 )
|
测试技术
HDU-1847,Good Luck in CET-4 Everybody!(巴什博弈)
HDU-1847,Good Luck in CET-4 Everybody!(巴什博弈)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
|
移动开发
洛谷P2639-[USACO09OCT]Bessie‘s Weight Problem G(01背包)
洛谷P2639-[USACO09OCT]Bessie‘s Weight Problem G(01背包)
洛谷P2639-[USACO09OCT]Bessie‘s Weight Problem G(01背包)
洛谷P6207-[USACO06OCT] Cows on Skates G(DFS记录路径)
洛谷P6207-[USACO06OCT] Cows on Skates G(DFS记录路径)
|
消息中间件 数据建模
题解 P1339 【[USACO09OCT]热浪Heat Wave】
题目链接 这道题纯属是一个裸的SPFA;建议先把模板AC之后再做。只需要做一些手脚,就是在加边的时候加一个双向边就好。然后再第一次加点的时候看不懂模板的出门左转度娘。推荐下面一片讲解:友链所以说,直接上代码。
1116 0
洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…【字符串+模拟】
P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He… 题目描述 众所周知,在每一个彗星后都有一只UFO。这些UFO时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。
1590 0
|
C++
COGS 144. [USACO Dec07] 魅力手镯【01背包复习】
144. [USACO Dec07] 魅力手镯    输入文件:charm.in   输出文件:charm.out   简单对比 时间限制:1 s   内存限制:8 MB 译 by CmYkRgB123 描述 贝茜去了大卖场的珠宝商店,发现一个魅力手镯,她想把最好的宝石镶嵌在这条手镯上。
1209 0