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
  • 相关阅读:
    【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】
    【POJ】1835:宇航员【模拟】【三维行走】
    【BZOJ】3195: [Jxoi2012]奇怪的道路【状压/奇偶性】【思路】
    【10.24校内测试】【欧拉路径(有向+无向)】【双向链表/树状数组/线段树】
    【POJ】1840:Eqs【哈希表】
    【洛谷】4317:花神的数论题【数位DP】
    【POJ】1486:Sorting Slides【二分图关键边判定】
    算法模板
    Redis源码阅读一:简单动态字符串SDS
    总结下c/c++的一些调试经验
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7323516.html
Copyright © 2011-2022 走看看