Cod sursa(job #1215450)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 1 august 2014 03:29:03
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include<cstdio>
#include<vector>
#include<stack>
#include<set>
#include<bitset>
using namespace std;
bitset<200100>v,x;
set<int>s;
stack<int>c;
vector<int>L[200100];
int n,m,i,j,a,b,niv[200100],low[200100],z[200100],y[200100],ok;
FILE *f,*g;
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
void dfs(int nod){
    int i;
    a++;
    v[nod]=1;
    x[nod]=1;
    c.push(nod);
    low[nod]=a;
    niv[nod]=a;
    for(i=0;i<L[nod].size();i++){
        b=L[nod][i];
        if(!v[b]){
            dfs(b);
            low[nod]=minim(low[nod],low[b]);
        }
        else if(x[b])
            low[nod]=minim(low[nod],low[b]);
    }
    if(low[nod]==niv[nod]){
        s.clear();
        do{
            b=c.top();
            c.pop();
            x[b]=0;
            if((b<=n&&s.find(b+n)!=s.end())||(b>n&&s.end()!=s.find(b-n)))
                ok=-1;
            s.insert(b);
            if(y[b]==0){
                y[b]=1;
                if(b<=n)
                    y[b+n]=-1;
                else
                    y[b-n]=-1;
            }
        }while(b!=nod);
    }
}
int main(){
    f=fopen("2sat.in","r");
    g=fopen("2sat.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d",&a,&b);
        if(a>0){
            if(b>0){
                L[a+n].push_back(b);
                L[b+n].push_back(a);
            }
            else{
                L[a+n].push_back(-b+n);
                L[a].push_back(-b);
            }
        }
        else{
            if(b>0){
                L[-a].push_back(b);
                L[-a+n].push_back(b+n);
            }
            else{
                L[-a].push_back(-b+n);
                L[-b].push_back(-a+n);
            }
        }
    }
    a=0;
    for(i=1;i<=2*n;i++){
        if(!v[i])
            dfs(i);
    }
    if(ok){
        fprintf(g,"-1");
        return 0;
    }
    for(i=1;i<=n;i++){
        if(y[i]==1)
            fprintf(g,"1 ");
        else
            fprintf(g,"0 ");
    }




    fclose(f);
    fclose(g);
    return 0;
}