zoukankan      html  css  js  c++  java
  • 2-SAT

    原理非常简单的啦。然而我做了一道模板题做了一个多小时。。

    hdu3052:

    WA了一个小时。我实在放弃了。于是上个厕所。突然想到了些什么,回到电脑前淡定的把一个+改成^。过了。。。早上真的学的太不顺利了。写了KMMLE。很认真找bug找了差不多一小时。继续MLE。。

    ○| ̄|_○| ̄|_○| ̄|_

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    #define rep(i,n) for(int i=1;i<=n;i++)
    #define clr(x,c) memset(x,c,sizeof(x))
    int read(){
        int x=0;
        char c=getchar();
        while(!isdigit(c)) c=getchar();
        while(isdigit(c)){
            x=x*10+c-'0';
            c=getchar();
        }
        return x;
    }
    const int nmax=1005;
    vector<int>f[nmax*2];
    int v[nmax*2],s[nmax*2],c,n,m;
    void add(int a,int va,int b,int vb){
        a=a*2+va;
        b=b*2+vb;
        f[a].push_back(b);
    }
    bool dfs(int x){
        if(v[x^1]) return false;   //就是这里就是这里!!!!!!!
        if(v[x]) return true;
        v[x]=1;
        s[c++]=x;
        for(int i=0;i<f[x].size();i++){
            if(!dfs(f[x][i]))
              return false;
        }
        return true;
    }
    bool solve(){
        for(int i=0;i<2*n;i+=2)
            if(!v[i]&&!v[i+1]){
                c=0;
                if(!dfs(i)){
                    while(c>0)
                        v[s[--c]]=0;
                    if(!dfs(i+1))
                         return false;
                }
                
            }
        return true;
    }
    void init(){
        for(int i=0;i<2*n;i++)
          f[i].clear();
        clr(v,0);
    }
    int main(){
        while(~scanf("%d%d",&n,&m)){
            init();
            rep(i,m){
                int a=read(),b=read(),va=read(),vb=read();
               add(a,va,b,vb^1);
               add(b,vb,a,va^1);
            }
             //printf(solve()?"YES
    ":"NO
    ");
             printf("%s
    ",solve()?"YES":"NO"); 
        }
        return 0;
    }

     poj3905:ps:还是模板题

    没错我又作死成功了没错没错。。。一直写的读入优化都没有遇到过负数的,然后这次就遇到了。于是我找找找,草read()怎么可能会有问题。跳过。看了好几遍之后才不得不看了下read()。不知道说些什么囧囧囧。加边这种写法更加简单一些。

    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define rep(i,n) for(int i=1;i<=n;i++)
    #define clr(x,c) memset(x,c,sizeof(x));
    int read(){
        int x=0;int f=1;
        char c=getchar();
        while(!isdigit(c)) {
            if(c=='-')           //这里这里这里!!!!
              f=-1;
            c=getchar();
        }
        while(isdigit(c)){
            x=x*10+c-'0';
            c=getchar();
        }
        return f*x;
    }
    const int nmax=1005;
    vector<int>f[nmax*2];
    int v[nmax*2],s[nmax*2],n,m,c;
    void add(int a,int va,int b,int vb){
        int x=a*2+va;
        int y=b*2+vb;
        f[x^1].push_back(y);
        f[y^1].push_back(x);              //这样子写简单了点!!!
    }
    bool dfs(int x){
        if(v[x^1]) return false;
        if(v[x]) return true;
        v[x]=1;
        s[c++]=x;
        for(int i=0;i<f[x].size();i++){
            if(!dfs(f[x][i]))
              return false;
        }
        return true;
    }
    bool solve(){
        for(int i=0;i<2*n;i+=2){
            if(!v[i]&&!v[i+1]){
                c=0;
                if(!dfs(i)){
                    while(c>0) v[s[--c]]=0;
                    if(!dfs(i+1))
                      return false;
                }
            }
        }
        return true;
    }
    void init(){
        for(int i=0;i<2*n;i++)
          f[i].clear();
        clr(v,0);
    }
    int main(){
        while(~scanf("%d%d",&n,&m)){
            init();
            rep(i,m){
                int u=read(),v=read();
                add(abs(u)-1,u<0?1:0,abs(v)-1,v<0?1:0);
            }
            printf("%d
    ",solve()?1:0);
        }
        return 0;
    }
  • 相关阅读:
    SQL语句集(转)
    Oracle 数据库 for update / for update nowait 的区别
    XML 关键字
    JAVA 操作 DBF 文件数据库
    Hibernate 懒加载和 Json 序列化冲突
    MYSQL 语法大全自己总结的
    php-laravel中间件使用
    php-表单验证
    php-laravel安装与使用
    iOS 关于权限设置的问题
  • 原文地址:https://www.cnblogs.com/20003238wzc--/p/4853120.html
Copyright © 2011-2022 走看看