• [POJ 3678] Katu Puzzle


    [题目链接]

              http://poj.org/problem?id=3678

    [算法]

            2-SAT

    [代码]

            

    #include <algorithm>  
    #include <bitset>  
    #include <cctype>  
    #include <cerrno>  
    #include <clocale>  
    #include <cmath>  
    #include <complex>  
    #include <cstdio>  
    #include <cstdlib>  
    #include <cstring>  
    #include <ctime>  
    #include <deque>  
    #include <exception>  
    #include <fstream>  
    #include <functional>  
    #include <limits>  
    #include <list>  
    #include <map>  
    #include <iomanip>  
    #include <ios>  
    #include <iosfwd>  
    #include <iostream>  
    #include <istream>  
    #include <ostream>  
    #include <queue>  
    #include <set>  
    #include <sstream>  
    #include <stdexcept>  
    #include <streambuf>  
    #include <string>  
    #include <utility>  
    #include <vector>  
    #include <cwchar>  
    #include <cwctype>  
    #include <stack>  
    #include <limits.h>
    using namespace std;
    #define MAXN 2010
    #define MAXM 1000010
    
    int i,n,m,tot,timer,cnt,a,b,c;
    int head[MAXN],belong[MAXN],dfn[MAXN],low[MAXN];
    bool instack[MAXN];
    string opt;
    bool flag;
    stack< int > s;
    
    struct edge
    {
            int to,nxt;
    } e[MAXM];
    inline void addedge(int u,int v)
    {
            tot++;
            e[tot] = (edge){v,head[u]};
            head[u] = tot;
    }
    inline void tarjan(int u)
    {
            int i,v;
            low[u] = dfn[u] = ++timer;
            instack[u] = true;
            s.push(u);
            for (i = head[u]; i; i = e[i].nxt)
            {
                    v = e[i].to;
                    if (!dfn[v])
                    {
                            tarjan(v);
                            low[u] = min(low[u],low[v]);
                    } else if (instack[v]) low[u] = min(low[u],dfn[v]);
            }
            if (dfn[u] == low[u])
            {
                    cnt++;
                    do
                    {
                            v = s.top(); 
                            s.pop();
                            belong[v] = cnt;
                            instack[v] = false;
                    } while (v != u);
            }
    }
    int main() 
    {
            
            ios :: sync_with_stdio(false);
            cin.tie(0); 
            while (cin >> n >> m)
            {
                    tot = cnt = timer = 0;
                    while (!s.empty()) s.pop();
                    memset(head,0,sizeof(head));
                    memset(belong,0,sizeof(belong));
                    memset(instack,false,sizeof(instack));
                    memset(low,0,sizeof(low));
                    memset(dfn,0,sizeof(dfn));
                    while (m--)
                    {
                            cin >> a >> b >> c >> opt;
                            if (opt == "AND")
                            {
                                    if (c == 0)
                                    {
                                            addedge(a + n,b);
                                            addedge(b + n,a);
                                    } else
                                    {
                                            addedge(a,a + n);
                                            addedge(b,b + n);
                                    }
                            }        
                            if (opt == "OR")
                            {
                                    if (c == 0)
                                    {
                                            addedge(a + n,a);
                                            addedge(b + n,b);
                                    } else
                                    {
                                            addedge(a,b + n);
                                            addedge(b,a + n);
                                    }
                            }
                            if (opt == "XOR")
                            {
                                    if (c == 0)
                                    {
                                            addedge(a,b);
                                            addedge(b,a);
                                            addedge(a + n,b + n);
                                            addedge(b + n,a + n);
                                    } else
                                    {
                                            addedge(a,b + n);
                                            addedge(b,a + n);
                                            addedge(a + n,b);
                                            addedge(b + n,a);
                                    } 
                            }
                    }
                    for (i = 0; i < 2 * n; i++)
                    {
                            if (!dfn[i])
                                    tarjan(i);
                    }
                    flag = true;
                    for (i = 0; i < n; i++)
                    {
                            if (belong[i] == belong[i + n])
                            {
                                    cout<< "NO" << endl;
                                    flag = false;
                                    break;
                            }
                    }
                    if (flag) cout<< "YES" << endl;
            }
            
            return 0;
        
    }
  • 相关阅读:
    2011年3月21日星期一
    AutoCAD VBA尺寸标注
    2011年3月22日星期二
    The method isEmpty() is undefined for the type String/String类型的isEmpty报错
    安全沙箱冲突..Error #2044: 未处理的 securityError:。 text=Error #2048: 安全沙箱冲
    Flash Builder4.6 无法启动,并且报 Failed to create the Java Virtual Machine (2—可能更好些)
    Flash Builder4.6 入门Demo_trace
    去掉JW Player水印及右键官方菜单
    JS如何判断单个radio是否被选中
    用JSON报错 java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeExcept .
  • 原文地址:https://www.cnblogs.com/evenbao/p/9399654.html
Copyright © 2020-2023  润新知