zoukankan      html  css  js  c++  java
  • poj3678 2- sat

    这题就是找合取范式比较麻烦

    AND   1    0必须取自己来造成矛盾,1必须取1

    AND   0    1必须取0

    OR     1     0必须取1

    OR     0     1必须取自己来造成矛盾

    XOR  1      0必须取1,1必须取0

    XOR   0     1必须取1,0必须取0

    然后就是tarjan扫一遍判断

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=2000+10,maxn=1000+10,inf=0x3f3f3f;
    
    stack<int>s;
    vector<int>v[N];
    int ins[N],inans[N];
    int dfn[N],low[N];
    int num,index;
    void tarjan(int u)
    {
        ins[u]=2;
        dfn[u]=low[u]=++index;
        s.push(u);
        for(int i=0;i<v[u].size();i++)
        {
            int x=v[u][i];
            if(!dfn[x])
            {
                tarjan(x);
                low[u]=min(low[u],low[x]);
            }
            else if(ins[x]==2)low[u]=min(low[u],dfn[x]);
        }
        if(dfn[u]==low[u])
        {
            ++num;
            while(!s.empty()){
                int k=s.top();
                s.pop();
                ins[k]=1;
                inans[k]=num;
                if(k==u)break;
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,m;
        cin>>n>>m;
        memset(ins,0,sizeof ins);
        memset(inans,0,sizeof inans);
        memset(dfn,0,sizeof dfn);
        memset(low,0,sizeof low);
        num=index=0;
        while(!s.empty())s.pop();
        for(int i=0;i<2*n;i++)v[i].clear();
        while(m--){
            int a,b,c;
            string s;
            cin>>a>>b>>c>>s;
            if(s[0]=='A')
            {
                if(c)
                {
                    v[a].push_back(a+n);
                    v[b].push_back(b+n);
                    v[a+n].push_back(b+n);
                    v[b+n].push_back(a+n);
                }
                else
                {
                    v[a+n].push_back(b);
                    v[b+n].push_back(a);
                }
            }
            else if(s[0]=='O')
            {
                if(c)
                {
                    v[a].push_back(b+n);
                    v[b].push_back(a+n);
                }
                else
                {
                    v[a].push_back(b);
                    v[b].push_back(a);
                    v[a+n].push_back(a);
                    v[b+n].push_back(b);
                }
            }
            else
            {
                if(c)
                {
                    v[a].push_back(b+n);
                    v[b].push_back(a+n);
                    v[a+n].push_back(b);
                    v[b+n].push_back(a);
                }
                else
                {
                    v[a].push_back(b);
                    v[b].push_back(a);
                    v[a+n].push_back(b+n);
                    v[b+n].push_back(a+n);
                }
            }
        }
        for(int i=0;i<2*n;i++)
            if(!dfn[i])
               tarjan(i);
        bool f=0;
        for(int i=0;i<n;i++)
            if(inans[i]==inans[i+n])
            {
                f=1;
                break;
            }
        if(f)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
        return 0;
    }
    /********************
    
    ********************/
    View Code
  • 相关阅读:
    洛谷P1012拼数(简单题排序技巧)
    欧拉函数(模板,相关问题持续更新中)
    欧几里得,扩展欧几里得(模板)
    快速幂(模板)
    读入读出挂
    webpack 使用style-loader,css-loader添加css样式
    webpack-dev-server工具
    webpack4 配置
    获取自定义属性值
    安装PS
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7323516.html
Copyright © 2011-2022 走看看