Alice要赢的话,只有两种情况,平和胜
对于A和B,若要求相同,x与y不同,x->~y,y->~x
若要求不同,x与y相同,x->~y,y->~x

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int t,n,m; 6 int a[10010]; 7 int f[4][2]; 8 void gao(){ 9 f[1][0]=1,f[1][1]=2; 10 f[2][0]=2,f[2][1]=3; 11 f[3][0]=3,f[3][1]=1; 12 } 13 struct edge{ 14 int v,next; 15 }e[100000]; 16 int head[20010],tol,z,top,cnt; 17 int dfn[20010],low[20010],st[20010],belong[20010]; 18 bool instack[20010]; 19 void init(){ 20 tol=z=top=cnt=0; 21 memset(head,-1,sizeof head); 22 memset(dfn,0,sizeof dfn); 23 memset(belong,0,sizeof belong); 24 memset(instack,0,sizeof instack); 25 } 26 void addedge(int u,int v){ 27 e[tol].v=v,e[tol].next=head[u],head[u]=tol++; 28 } 29 void tarjan(int u){ 30 dfn[u]=low[u]=++cnt; 31 st[top++]=u,instack[u]=1; 32 for(int i=head[u];i!=-1;i=e[i].next){ 33 int v=e[i].v; 34 if(!dfn[v]){ 35 tarjan(v); 36 low[u]=min(low[u],low[v]); 37 }else if(instack[v]){ 38 low[u]=min(low[u],dfn[v]); 39 } 40 } 41 if(low[u]==dfn[u]){ 42 int now; 43 do{ 44 now=st[--top],instack[now]=0; 45 belong[now]=z; 46 }while(now!=u); 47 z++; 48 } 49 } 50 int g(int x){ 51 if(x>n) x-=n; 52 else x+=n; 53 return x; 54 } 55 int main(){ 56 scanf("%d",&t); 57 gao(); 58 for(int ca=1;ca<=t;ca++){ 59 scanf("%d%d",&n,&m); 60 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 61 int u,v,k; 62 init(); 63 for(int i=0;i<m;i++){ 64 scanf("%d%d%d",&u,&v,&k); 65 if(k){ 66 for(int p=0;p<2;p++){ 67 for(int q=0;q<2;q++){ 68 if(f[a[u]][p]==f[a[v]][q]){ 69 addedge(u+n*p,g(v+n*q)); 70 addedge(v+n*q,g(u+n*p)); 71 } 72 } 73 } 74 }else{ 75 for(int p=0;p<2;p++){ 76 for(int q=0;q<2;q++){ 77 if(f[a[u]][p]!=f[a[v]][q]){ 78 addedge(u+n*p,g(v+n*q)); 79 addedge(v+n*q,g(u+n*p)); 80 } 81 } 82 } 83 } 84 } 85 for(int i=1;i<=2*n;i++){ 86 if(!dfn[i]) tarjan(i); 87 } 88 bool yes=1; 89 for(int i=1;i<=n;i++){ 90 if(belong[i]==belong[n+i]){yes=0;break;} 91 } 92 printf("Case #%d: ",ca); 93 if(yes) cout<<"yes"<<endl; 94 else cout<<"no"<<endl; 95 } 96 return 0; 97 }