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 }

 

posted @ 2018-01-17 19:45  大奕哥&VANE  阅读(281)  评论(0编辑  收藏  举报