hdu4115 Eliminate the Conflict

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 }
hdu4115
原文地址:https://www.cnblogs.com/wonderzy/p/3421331.html