Cod sursa(job #2527919)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 21 ianuarie 2020 09:02:44
Problema 2SAT Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>
#define DIM 200010
using namespace std;

ifstream fin ("2sat.in");
ofstream fout ("2sat.out");
vector <int> L[DIM],v;
int viz[DIM],low[DIM],niv[DIM],sol[DIM];
deque <int> s;
int n,m,i,x,y,xx,yy,idx,ok;
int convert (int x){
    if (x > 0)
        return x+n;
    return -x;
}
int convert2 (int x){
    if (x <= n)
        return x+n;
    return x-n;
}
void dfs (int nod){
    viz[nod] = 1;
    low[nod] = niv[nod] = ++idx;
    s.push_back(nod);
    for (auto vecin:L[nod]){
        if (!niv[vecin]){
            dfs (vecin);
            low[nod] = min (low[nod],low[vecin]);
        } else {
            if (viz[vecin])
                low[nod] = min (low[nod],low[vecin]);
        }
    }
    if (low[nod] == niv[nod]){
        /// am componenta tare conexa
        /// toate nodurile din componenta trb sa aiba aceeasi valoare
        int x;
        v.clear();
        do{
            x = s.back();
            s.pop_back();
            v.push_back(x);
            viz[x] = 0;

        } while (x != nod);

        int val = 1;
        for (auto it:v){
            if (sol[i] != -1){
                val = sol[i];
                break;
            }}

        /// le fac pe toate val
        for (auto it:v){
            if (sol[it] == 1-val)
                ok = 1;
            if (sol[convert2(it)] == val)
                ok = 1;

            sol[it] = val;
            sol[convert2(it)] = 1-val;
        }
    }
}
int main (){

    fin>>n>>m;
    for (i=1;i<=m;i++){
        fin>>x>>y;
        xx = convert (x), yy = convert (y);
        if (x < 0)
            x = -x+n;
        if (y < 0)
            y = -y+n;
        L[x].push_back(yy);
        L[y].push_back(xx);
    }

    for (i=1;i<=2*n;i++)
        sol[i] = -1;

    for (i=1;i<=2*n;i++)
        if (!viz[i])
            dfs (i);

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

    return 0;
}