1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <iostream> #include <cstring> #include <cstdio> #include <vector> using namespace std; #define N 1010 #define cl memset #define pb push_back
vector<int>e[2*N]; int n,tot; int dfn[2*N],low[2*N],belong[2*N],stack[2*N],dcnt,bcnt,top; bool ins[2*N];
inline void add(int u ,int v){ e[u].pb(v); }
void tarjan(int u){ dfn[u] = low[u] = ++dcnt; stack[++top] = u; ins[u] = true; for(int i = 0; i < e[u].size(); i++){ int v = e[u][i]; if(!dfn[v]){ tarjan(v); low[u] = min(low[u],low[v]); } else if(ins[v]) low[u] = min(low[u],dfn[v]); } if(dfn[u] == low[u]){ ++bcnt; while(true){ int x = stack[top--]; ins[x] = false; belong[x] = bcnt; if(x == u) break; } } }
void scc(){ dcnt = bcnt = top = 0; cl(dfn,0,sizeof(dfn)); cl(ins,false,sizeof(ins)); for(int i = 0; i < 2*n; i++) if(!dfn[i]) tarjan(i);
}
int main(){ while(scanf("%d%d",&n,&tot)!=EOF){ for(int i = 0; i < 2*n; i++) e[i].clear(); for(int i = 0; i < tot; i++){ int u,v,s; char op[10]; scanf("%d%d%d%s",&u,&v,&s,op); if(op[0] == 'A'){ if(s == 1){ add(u<<1,u<<1|1); add(v<<1,v<<1|1); } else{ add(u<<1|1,v<<1); add(v<<1|1,u<<1); } } else if(op[0] == 'O'){ if(s == 1){ add(u<<1,v<<1|1); add(v<<1,u<<1|1); } else{ add(u<<1|1,u<<1); add(v<<1|1,v<<1); } } else{ if(s == 1){ add(u<<1|1,v<<1); add(v<<1|1,u<<1); add(u<<1,v<<1|1); add(v<<1,u<<1|1); } else{ add(u<<1,v<<1); add(u<<1|1,v<<1|1); add(v<<1,u<<1); add(v<<1|1,u<<1|1); } } } scc(); bool res = true; for(int i = 0; i < n; i++) if(belong[i<<1] == belong[i<<1|1]){ res = false; break; } printf("%s\n",res ? "YES" : "NO"); } return 0; }
|