zoukankan      html  css  js  c++  java
  • 2-sat——poj3678经典建图

    比较经典的建图,详见进阶指南

    2-sat一般要用到tarjan来求强连通分量

    /*2-sat要加的是具有强制关系的边*/
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    #define N 2005
    #define M 2000005
    struct Edge{int to,nxt;}e[M<<1];
    int n,m,head[N],tot;
    void init(){
        memset(head,-1,sizeof head);
    }
    void add(int u,int v){
        e[tot].to=v;
        e[tot].nxt=head[u];
        head[u]=tot++;
    }
    
    
    int low[N],dfn[N],cnt,id[N],ind,stk[N],top,ins[N];
    void tarjan(int x){
        dfn[x]=low[x]=++ind;
        stk[++top]=x;ins[x]=1;
        for(int i=head[x];i!=-1;i=e[i].nxt){
            int y=e[i].to;
            if(!dfn[y]){
                tarjan(y);
                low[x]=min(low[x],low[y]);
            }
            else if(ins[y])
                low[x]=min(low[x],low[y]);
        }
        if(dfn[x]==low[x]){
            cnt++;int y;
            do{
                y=stk[top--];
                ins[y]=0;
                id[y]=cnt;
            }while(x!=y);
        }
    }
    
    int main(){
        init();
        int a,b,c;
        char op[10];
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d %s",&a,&b,&c,op);
            a++,b++;
            if(op[0]=='A'){
                if(c==0)add(a+n,b),add(b+n,a);
                if(c==1)add(a,a+n),add(b,b+n);            
            }
            if(op[0]=='O'){
                if(c==0)add(a+n,a),add(b+n,b);
                if(c==1)add(a,b+n),add(b,a+n);
            }
            if(op[0]=='X'){
                if(c==0)add(a,b),add(b,a),add(a+n,b+n),add(b+n,a+n);
                if(c==1)add(a,b+n),add(a+n,b),add(b,a+n),add(b+n,a);
            }
        }
        for(int i=1;i<=2*n;i++)
            if(!dfn[i])tarjan(i);
        for(int i=1;i<=n;i++)
            if(id[i]==id[i+n]){
                puts("NO");
                return 0;
            }    
        puts("YES");
    }
  • 相关阅读:
    小米面试之股票收益最大
    第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe
    第三周 anaconda的安装
    第二周:python实现线性回归(哑变量回归)的高效方法
    第一周:在python里调用C文件中函数
    13G:神奇的数列
    13F:图像分割
    13E:吃奶酪
    13D:拖延症
    13B:回文子串
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10870353.html
Copyright © 2011-2022 走看看