Cod sursa(job #1989937)

Utilizator MaarcellKurt Godel Maarcell Data 9 iunie 2017 17:31:04
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
using namespace std;

#define fi first
#define se second
typedef long long LL;
typedef long double LD;

const int MAXN=100010;
int N,M,st[2*MAXN+10],K;
vector<int> g[2*MAXN+10],gc[2*MAXN+10];
int comp[2*MAXN+10],nrC;


int id(int x){
    if (x>0) return 2*x-1;
    return 2*(-x);
}

void dfs1(int nod){
    comp[nod]=1;
    for (int nxt : g[nod])
        if (!comp[nxt]) dfs1(nxt);
    st[++K]=nod;
}

void dfs2(int nod){
    comp[nod]=nrC;
    for (int nxt : gc[nod])
        if (!comp[nxt]) dfs2(nxt);
}

int main(){
    ifstream fin("2sat.in");
    ofstream fout("2sat.out");
    fin >> N >> M;

    int i,x,y;
    for (i=1; i<=M; i++){
        fin >> x >> y;
        g[id(-x)].push_back(id(y));
        g[id(-y)].push_back(id(x));

        gc[id(y)].push_back(id(-x));
        gc[id(x)].push_back(id(-y));
    }

    for (i=1; i<=2*N; i++)
        if (!comp[i]) dfs1(i);

    memset(comp,0,sizeof(comp));
    for (i=2*N; i>0; i--)
        if (!comp[st[i]]) nrC++,dfs2(st[i]);

    for (i=1; i<=N; i++)
        if (comp[id(i)]==comp[id(-i)]){
            fout << -1 << "\n";
            return 0;
        }

    for (i=1; i<=N; i++)
        fout << (comp[id(i)]>comp[id(-i)]) << " ";
    fout << "\n";
    return 0;
}