Description
Input
Output
Sample Input
2 3 3 1 1 1 1 2 1 1 3 1 2 3 1 5 5 1 2 3 2 1 1 2 1 1 3 1 1 4 1 1 5 1 2 3 0
Sample Output
Case #1: no Case #2: yes
Hint
'Rock, Paper and Scissors' is a game which played by two person. They should play Rock, Paper or Scissors by their hands at the same time.
Rock defeats scissors, scissors defeats paper and paper defeats rock. If two people play the same item, the game is tied..
出一个的限制。出一样与不同,拆成石头剪子布,三点,一次一一对应就好了。
#include<cstdio> #include<cstring> #include<iostream> #define FOR(i,a,b) for(int i=a;i<=b;++i) #define clr(f,z) memset(f,z,sizeof(f)) using namespace std; const int mm=400010; class Edge { public:int v,next; }; class TWO_SAT { public: int dfn[mm],e_to[mm],stack[mm]; Edge e[mm*2]; int edge,head[mm],top,dfs_clock,bcc; void clear() { edge=0;clr(head,-1); } void add(int u,int v) { e[edge].v=v;e[edge].next=head[u];head[u]=edge++; } void add_my(int x,int xval,int y,int yval) { x=x+x+xval;y=y+y+yval; add(x,y); } void add_clause(int x,int xval,int y,int yval) {///x or y x=x+x+xval; y=y+y+yval; add(x^1,y);add(y^1,x); } void add_con(int x,int xval) { x=x+x+xval; add(x^1,x); } int tarjan(int u) { int lowu,lowv; lowu=dfn[u]=++dfs_clock; int v; stack[top++]=u; for(int i=head[u];~i;i=e[i].next) { v=e[i].v; if(!dfn[v]) { lowv=tarjan(v); lowu=min(lowv,lowu); } else if(e_to[v]==-1)//in stack lowu=min(lowu,dfn[v]); } if(dfn[u]==lowu) { ++bcc; do{ v=stack[--top]; e_to[v]=bcc; }while(v!=u); } return lowu; } bool find_bcc(int n) { clr(e_to,-1); clr(dfn,0); bcc=dfs_clock=top=0; FOR(i,0,2*n-1) if(!dfn[i]) tarjan(i); for(int i=0;i<2*n;i+=2) if(e_to[i]==e_to[i^1])return 0; return 1; } }two; int n,m; int main() { int a,b,c,d,cas; scanf("%d",&cas); FOR(ca,1,cas) { scanf("%d%d",&n,&m); two.clear(); FOR(i,0,n-1) { scanf("%d",&a); --a; two.add_con(i*3+(a+2)%3,0); two.add_clause(i*3+a,1,i*3+(a+1)%3,1); two.add_clause(i*3+a,0,i*3+(a+1)%3,0); } FOR(i,1,m) { scanf("%d%d%d",&a,&b,&c); --a;--b; if(c)///diffrerent {two.add_clause(a*3,0,b*3,0); two.add_clause(a*3+1,0,b*3+1,0); two.add_clause(a*3+2,0,b*3+2,0); } else ///same { two.add_clause(a*3,0,b*3,1); two.add_clause(a*3,1,b*3,0); two.add_clause(a*3+1,0,b*3+1,1); two.add_clause(a*3+1,1,b*3+1,0); two.add_clause(a*3+2,0,b*3+2,1); two.add_clause(a*3+2,1,b*3+2,0); } } printf("Case #%d: ",ca); if(two.find_bcc(n*3))printf("yes\n"); else printf("no\n"); } }