Cod sursa(job #1542415)

Utilizator lianaliana tucar liana Data 5 decembrie 2015 12:50:34
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include<vector>
#include<stdio.h>
using namespace std;
#define nmax  2*100005
vector <int> ma[nmax], mat[nmax], comp[nmax];
vector <int> ::iterator it;
int i, n, m, a, nrcomp, b, viz[nmax],rez[nmax],  v[nmax], nt, vcomp[nmax], v2[nmax], poz, ok, val[nmax];

int non(int x){
    if(x<=n)
        return x+n;
    return x-n;
}

void citire(){
    scanf("%d %d",&n,&m);
    for (int i=1;i<=m;i++){
        scanf("%d %d",&a,&b);
        if (a<0)
            a=n-a;
        if (b<0)
            b=n-b;
        ma[non(a)].push_back(b);
        ma[non(b)].push_back(a);
        mat[b].push_back(non(a));
        mat[a].push_back(non(b));
    }
}

void dfs1(int x){
    vector <int> ::iterator it;
    viz[x]=1;
    for (it=ma[x].begin();it!=ma[x].end();it++)
        if (!viz[*it])
            dfs1(*it);
    v[++nt]=x;
}

void dfs2(int x){
    vector<int> ::iterator it;
    viz[x]=2;
    rez[non(x)]=1;
    for (it=mat[x].begin();it!=mat[x].end();it++)
        if (viz[*it]<2)
            dfs2(*it);
}

int main(){
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    citire();
    for (int i=1;i<=2*n;i++)
        if (!viz[i])
            dfs1(i);
    for (int i=nt;i>=1;i--)
        if ((viz[v[i]]!=2)&&(viz[non(v[i])]!=2)){
            dfs2(v[i]);
        }
    ok=1;
    for (int i=1;i<=n;i++)
        if ((rez[i]==rez[non(i)]) &&(rez[i]==1))
        {
            ok=0;
            break;
        }
    if (!ok){
        printf("-1\n");
    }
    else{
        for (int i=1;i<=n;i++)
            printf("%d ",rez[i]);
    }
    return 0;
}