• poj 3678 2-sat


    理清逻辑关系即可。

      1 #include <algorithm>
      2 #include <iostream>
      3 #include <cstring>
      4 #include <cstdio>
      5 using namespace std;
      6 
      7 const int N = 1000;
      8 const int M = 5000000;
      9 int head[N * 2];
     10 int s[N * 2];
     11 bool mark[N * 2];
     12 int n, m, e, c;
     13 
     14 struct Edge
     15 {
     16     int v, next;
     17 } edge[M];
     18 
     19 void addEdge( int u, int v )
     20 {
     21     edge[e].v = v;
     22     edge[e].next = head[u];
     23     head[u] = e++;
     24 }
     25 
     26 void init()
     27 {
     28     e = 0;
     29     memset( head, -1, sizeof(head) );
     30     memset( mark, false, sizeof(mark) );
     31 }
     32 
     33 bool dfs( int u )
     34 {
     35     if ( mark[u ^ 1] ) return false;
     36     if ( mark[u] ) return true;
     37     mark[u] = true;
     38     s[c++] = u;
     39     for ( int i = head[u]; i != -1; i = edge[i].next )
     40     {
     41         int v = edge[i].v;
     42         if ( !dfs(v) ) return false;
     43     }
     44     return true;
     45 }
     46 
     47 bool solve()
     48 {
     49     for ( int i = 0; i < 2 * n; i += 2 )
     50     {
     51         if ( !mark[i] && !mark[i + 1] )
     52         {
     53             c = 0;
     54             if ( !dfs(i) )
     55             {
     56                 while ( c )
     57                 {
     58                     c--;
     59                     mark[s[c]] = false;
     60                 }
     61                 if ( !dfs( i + 1 ) ) return false;
     62             }
     63         }
     64     }
     65     return true;
     66 }
     67 
     68 int main ()
     69 {
     70     while ( scanf("%d%d", &n, &m) != EOF )
     71     {
     72         init();
     73         int x, y, z;
     74         char op[11];
     75         while ( m-- )
     76         {
     77             scanf("%d%d%d%s", &x, &y, &z, op);
     78             x = x << 1, y = y << 1;
     79             if ( op[0] == 'A' )
     80             {
     81                 if ( z == 0 )
     82                 {
     83                     addEdge( x ^ 1, y );
     84                     addEdge( y ^ 1, x );
     85                 }
     86                 else
     87                 {
     88                     addEdge( x, x ^ 1 );
     89                     addEdge( y, y ^ 1 );
     90                 }
     91             }
     92             else if ( op[0] == 'O' )
     93             {
     94                 if ( z == 0 )
     95                 {
     96                     addEdge( x ^ 1, x );
     97                     addEdge( y ^ 1, y );
     98                 }
     99                 else
    100                 {
    101                     addEdge( x, y ^ 1 );
    102                     addEdge( y, x ^ 1 );
    103                 }
    104             }
    105             else if ( op[0] == 'X' )
    106             {
    107                 if ( z == 0 )
    108                 {
    109                     addEdge( x, y );
    110                     addEdge( x ^ 1, y ^ 1 );
    111                     addEdge( y, x );
    112                     addEdge( y ^ 1, x ^ 1 );
    113                 }
    114                 else
    115                 {
    116                     addEdge( x, y ^ 1 );
    117                     addEdge( x ^ 1, y );
    118                     addEdge( y, x ^ 1 );
    119                     addEdge( y ^ 1, x );
    120                 }
    121             }
    122         }
    123         if ( solve() )
    124         {
    125             printf("YES
    ");
    126         }
    127         else
    128         {
    129             printf("NO
    ");
    130         }
    131     }
    132     return 0;
    133 }
  • 相关阅读:
    SecureCRT + Tmux 分屏 高效开发
    Python—基础之杂货铺
    Python—五大基本语句
    Python—运算符的类型
    Python—基本数据类型
    Python—变量详解
    Python—虚拟环境的创建与管理(virtualenv与virtualenvwrapper)
    Mysql—数据库管理与表管理
    Linux—服务器SSL/TLS快速检测工具(TLSSLed)
    Linux—yum使用详解
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4699831.html
Copyright © 2020-2023  润新知