首页 > 代码库 > 【无聊放个模板系列】POJ 3678 2-SAT

【无聊放个模板系列】POJ 3678 2-SAT

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<cmath>
  8 #include<stack>
  9 using namespace std;
 10 #define Maxn 1010
 11 #define Maxm 1000010
 12 
 13 char s[10];
 14 int n,m;
 15 
 16 struct node
 17 {
 18     int x,y,next;
 19 }t[4*Maxm];int len;
 20 int first[2*Maxn];
 21 
 22 void ins(int x,int y)
 23 {
 24     t[++len].x=x;t[len].y=y;
 25     t[len].next=first[x];first[x]=len;
 26 }
 27 
 28 bool mark[2*Maxn];
 29 int S[2*Maxn];
 30 
 31 bool dfs(int x)
 32 {
 33     if(mark[x^1]) return 0;
 34     if(mark[x]) return 1;
 35     S[++S[0]]=x;mark[x]=1;
 36     for(int i=first[x];i;i=t[i].next)
 37     {
 38         int y=t[i].y;
 39         if(!dfs(y)) return 0;
 40     }
 41     return 1;
 42 }
 43 
 44 bool tsat()
 45 {
 46     for(int i=0;i<n;i++)
 47     {
 48         if(!mark[2*i]&&!mark[2*i+1])
 49         {
 50             S[0]=0;
 51             if(!dfs(2*i))
 52             {
 53                 while(S[0]) mark[S[S[0]--]]=0;
 54                 if(!dfs(2*i+1)) return 0;
 55             }
 56         }
 57     }
 58     return 1;
 59 }
 60 
 61 int main()
 62 {
 63     scanf("%d%d",&n,&m);
 64     len=0;
 65     memset(first,0,sizeof(first));
 66     for(int i=1;i<=m;i++)
 67     {
 68         int x,y,z;
 69         scanf("%d%d%d",&x,&y,&z);
 70         scanf("%s",s);
 71         if(s[0]==A)
 72         {
 73             if(z==1)
 74             {
 75                 ins(2*x,2*y);ins(2*x,2*y+1);
 76                 ins(2*y,2*x);ins(2*y,2*x+1);
 77             }
 78             else
 79             {
 80                 ins(2*x+1,2*y);
 81                 ins(2*y+1,2*x);
 82             }
 83         }
 84         else if(s[0]==O)
 85         {
 86             if(z==1)
 87             {
 88                 ins(2*x,2*y+1);
 89                 ins(2*y,2*x+1);
 90             }
 91             else
 92             {
 93                 ins(2*x+1,2*y);ins(2*x+1,2*y+1);
 94                 ins(2*y+1,2*x);ins(2*y+1,2*x+1);
 95             }
 96         }
 97         else if(s[0]==X)
 98         {
 99             if(z==1)
100             {
101                 ins(2*x,2*y+1);ins(2*x+1,2*y);
102                 ins(2*y,2*x+1);ins(2*y+1,2*x);
103             }
104             else
105             {
106                 ins(2*x,2*y);ins(2*x+1,2*y+1);
107                 ins(2*y,2*x);ins(2*y+1,2*x+1);
108             }
109         }
110     }
111     if(tsat()) printf("YES\n");
112     else printf("NO\n");
113     return 0;
114 }

 

2-SAT

2016-11-17 22:00:10

【无聊放个模板系列】POJ 3678 2-SAT