zoukankan      html  css  js  c++  java
  • poj 3678 Katu Puzzle 夜

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

    2-SAT 问题 关键在于处理关系 看了别人的解析 自己还是不行呀

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<string>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #define LL long long
    
    using namespace std;
    
    const int N=2005;
    struct node
    {
        struct tt *next;
    }mem[N];
    struct tt
    {
        int j;
        struct tt *next;
    };
    int dfn[N];
    int low[N];
    bool in[N];
    bool visited[N];
    int deep;
    int f[N];
    stack<int>str;
    void build(int i,int j)
    {
        struct tt *t=new tt;
        t->j=j;
        t->next=mem[i].next;
        mem[i].next=t;
    }
    void Dele(int n)
    {
        for(int i=0;i<=n;++i)
        mem[i].next=NULL;
    }
    void Tarjan(int x)
    {
        visited[x]=true;
        str.push(x);
        in[x]=true;
        dfn[x]=low[x]=deep++;
        struct tt *t=mem[x].next;
        while(t!=NULL)
        {
            if(visited[t->j]==false)
            {
                Tarjan(t->j);
                low[x]=min(low[x],low[t->j]);
            }else if(in[t->j]==true)
            {
                low[x]=min(low[x],dfn[t->j]);
            }
            t=t->next;
        }
        if(low[x]==dfn[x])
        {
            while(str.top()!=x)
            {
                int k=str.top();
                str.pop();
                in[k]=false;
                f[k]=x;
            }
            int k=str.top();
            str.pop();
            in[k]=false;
            f[k]=x;
        }
    
    }
    inline void Judge(int a,int b,int c,char s[],int n)
    {
        if(s[0]=='A')
        {
            if(c==1)
            {
                build(a+n,a);build(b+n,b);//a表示1 a+n表示0 b也一样
            }else
            {
                build(a,b+n);build(b,a+n);
            }
            return ;
        }
        if(s[0]=='O')
        {
            if(c==1)
            {
                build(a+n,b);build(b+n,a);
            }else
            {
                build(a,a+n);build(b,b+n);
            }
            return ;
        }
        if(s[0]=='X')
        {
            if(c==1)
            {
                build(a,b+n);build(a+n,b);
                build(b,a+n);build(b+n,a);
            }else
            {
                build(a,b);build(a+n,b+n);
                build(b,a);build(b+n,a+n);
            }
        }
    }
    int main()
    {
        //freopen("data.txt","r",stdin);
        int n,m;
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            int a,b,c;
            char s[5];
            for(int i=0;i<m;++i)
            {
                scanf("%d %d %d %s",&a,&b,&c,s);
                Judge(a,b,c,s,n);
            }
            while(!str.empty())
            str.pop();
            memset(dfn,-1,sizeof(dfn));
            memset(low,-1,sizeof(low));
            memset(in,false,sizeof(in));
            memset(visited,false,sizeof(visited));
            memset(f,-1,sizeof(f));
            deep=0;
            int l;
            for(l=0;l<n;++l)
            {
                if(visited[l]==false)
                Tarjan(l);
                if(f[l]==f[l+n])
                break;
            }
            if(l<n)
            printf("NO\n");
            else
            printf("YES\n");
            Dele(n*2);
        }
        return 0;
    }
    

      

  • 相关阅读:
    c++ 队列
    17:特殊类成员:函数指针5
    c++ deque 双端队列
    18:字符串-char型字符串
    c++ 16 this 和 继承 及继承机制中的构造函数 与 析构函数
    c++ string char* const char*
    c++ 小片段
    google protobuf 使用示例
    hibernate-cache
    hibernate-criteria查询(二)
  • 原文地址:https://www.cnblogs.com/liulangye/p/2639724.html
Copyright © 2011-2022 走看看