Cod sursa(job #3325602)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 25 noiembrie 2025 20:06:07
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("2sat.in");
ofstream fout("2sat.out");
vector<int> gr[2 * 100002], gri[2 * 100002];
int n, m, i, x, y;
int comp[100002];
bool viz[100002];

int stiv[2 * 100002], top;

static inline int Not(int nod) {
    if(nod > n) return nod - n;
    return nod + n;
}

static inline void CTC_DFSInit(int nod) {
    viz[nod] = true;
    for(int urm : gr[nod]) {
        if(!viz[urm]) CTC_DFSInit(urm);
    }
    stiv[++top] = nod;
}

static inline void CTC_DFSComp(int nod, const int compCur) {
    viz[nod] = true;
    comp[nod] = compCur;
    for(int urm : gri[nod]) {
        if(!viz[urm]) CTC_DFSComp(urm, compCur);
    }
}

static inline void CTC_Run() {
    for(i = 1; i <= 2 * n; i++) {
        if(!viz[i]) CTC_DFSInit(i);
    }
    memset(viz, false, sizeof(viz));
    while(top) {
        if(!viz[stiv[top]]) {
            CTC_DFSComp(stiv[top], ++comp[0]);
        }
        top--;
    }
}

int main() {
    //ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    fin >> n >> m;
    for(i = 1; i <= m; i++) {
        fin >> x >> y;
        if(x < 0) x = -x + n;
        if(y < 0) y = -y + n;

        gr[Not(x)].push_back(y);
        gr[Not(y)].push_back(x);

        gri[y].push_back(Not(x));
        gri[x].push_back(Not(y));
    }

    CTC_Run();

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

    for(i = 1; i <= n; i++) {
        fout << (comp[i] < comp[i + n]) << " ";
    }

    return 0;
}