POJ3687 Katu Puzzle
好好写2-sat
如果a1-->b1矛盾则连边a1-->b2和b1-->a2
我定了一个ccnt和cnt变量,结果少打一个c,wa了好多次(lll¬ω¬)
By:大奕哥
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<vector> 7 #include<queue> 8 using namespace std; 9 const int N=1e4+10; 10 int top,num,cnt,ccnt,n,m; 11 int low[N],dfn[N],vis[N],head[N],col[N],s[N]; 12 struct node 13 { 14 int to,nex; 15 }e[4200000]; 16 void add(int x,int y) 17 { 18 e[++ccnt].to=y;e[ccnt].nex=head[x];head[x]=ccnt; 19 } 20 void dfs(int x) 21 { 22 s[++top]=x;dfn[x]=low[x]=++cnt;vis[x]=1; 23 for(int i=head[x];i;i=e[i].nex) 24 { 25 int y=e[i].to; 26 if(!dfn[y]) 27 { 28 dfs(y); 29 low[x]=min(low[x],low[y]); 30 } 31 else if(vis[y]) 32 low[x]=min(low[x],dfn[y]); 33 } 34 if(low[x]==dfn[x]) 35 { 36 ++num; 37 while(s[top+1]!=x) 38 { 39 int a=s[top--]; 40 vis[a]=0; 41 col[a]=num; 42 } 43 } 44 } 45 bool solve() 46 { 47 for(int i=1;i<=n*2;++i) 48 { 49 if(!dfn[i])dfs(i); 50 } 51 for(int i=1;i<=n;++i)if(col[i]==col[i+n])return 0; 52 return 1; 53 } 54 void init() 55 { 56 top=num=cnt=ccnt=0; 57 memset(low,0,sizeof(low)); 58 memset(dfn,0,sizeof(dfn)); 59 memset(head,0,sizeof(head)); 60 memset(vis,0,sizeof(vis)); 61 memset(col,0,sizeof(col)); 62 } 63 int main() 64 { 65 while(~ scanf("%d%d",&n,&m)) 66 { 67 init();int a,b,c;char s[5]; 68 for(int i=1;i<=m;++i) 69 {//x 0 x+n 1 70 scanf("%d%d%d%s",&a,&b,&c,s);a++;b++; 71 if(s[0]=='A') 72 { 73 if(c==1) 74 { 75 add(a+n,b+n);add(b,a);//1 0 76 add(a,b);add(b+n,a+n);// 0 1 77 add(a,b+n);add(b,a+n);// 0 0 78 } 79 else 80 { 81 add(a+n,b);add(b+n,a);//1 1 82 } 83 } 84 else if(s[0]=='X') 85 { 86 if(c==1) 87 { 88 add(a+n,b);add(b+n,a);//1 1 89 add(a,b+n);add(b,a+n);// 0 0 90 } 91 else 92 { 93 add(a,b);add(b+n,a+n);// 0 1 94 add(a+n,b+n);add(b,a);// 1 0 95 } 96 } 97 else 98 { 99 if(c==1) 100 { 101 add(a,b+n);add(b,a+n);//0 0 102 } 103 else 104 { 105 add(a+n,b);add(b+n,a);// 1 1 106 add(a+n,b+n);add(b,a);// 1 0 107 add(a,b);add(b+n,a+n);// 0 1 108 } 109 } 110 } 111 if(solve())puts("YES"); 112 else puts("NO"); 113 } 114 }
生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。