Cod sursa(job #1471612)

Utilizator timicsIoana Tamas timics Data 14 august 2015 17:57:23
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
int N,M,x,y,s[210000],curr,c[210000],comp,sol[210000];
vector<int> m[210000],n[210000],v[210000];
bool viz[210000],ok=1,vz[210000];

void dfs(int x) {
    viz[x] = 1;
    for(int i=0;i<m[x].size();++i) {
        if(!viz[m[x][i]]) {
            dfs(m[x][i]);
        }
    }
    s[++curr] = x;
}

void dfs2(int x) {
    viz[x] = 0;
    c[x] = comp;
    v[comp].push_back(x);
    for(int i=0;i<n[x].size();++i) {
        if(viz[n[x][i]]) {
            dfs2(n[x][i]);
        }
    }
}

inline int ng(int x) {
    if(x%2==0) return x+1;
    else return x-1;
}

void f(int x, int val) {
    vz[x] = 1;
    for(int i=0;i<v[x].size();++i) {
        int y = v[x][i];
        if(sol[y] && sol[y]!=val) {
            ok = 0;
        }
        sol[y] = val;
    }
    for(int i=0;i<v[x].size();++i) {
        int y = ng(v[x][i]);
        if(sol[y] && sol[y]!=3-val) {
            ok = 0;
        }
        if(!sol[y]) {
            f(c[y],3-val);
        }
    }
}

int main() {
	freopen("2sat.in","r",stdin);
	freopen("2sat.out","w",stdout);
	//freopen("input.in","r",stdin);
	scanf("%d%d",&N,&M);
    for(int i=0;i<M;++i) {
        scanf("%d%d",&x,&y);
        int a = 0, b = 0;
        if(x < 0) {
            a = 1;
            x = -x;
        }
        if(y < 0) {
            b = 1;
            y = -y;
        }
        
        m[2*x+(1-a)].push_back(2*y+b);
        m[2*y+(1-b)].push_back(2*x+a);
        n[2*y+b].push_back(2*x+(1-a));
        n[2*x+a].push_back(2*y+(1-b));
    }
    for(int i=2;i<=2*N+1;++i) {
        if(!viz[i]) {
            dfs(i);
        }
    }

    for(int i=curr;i>=1;--i) {
        if(viz[s[i]]) {
            ++comp;
            dfs2(s[i]);
        }
    }

    for(int i=1;i<=comp;++i) {
        if(!vz[i]) {
            f(i,1); //make neg
        }
    }

    if(!ok) {
        printf("-1");
    } else {
        for(int i=2;i<=2*N;i+=2) {
            printf("%d ",sol[i]-1);
        }
    }

    return 0;
}