Cod sursa(job #1465430)

Utilizator CollermanAndrei Amariei Collerman Data 27 iulie 2015 12:58:31
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<bitset>
#include<vector>
using namespace std;
ofstream fout("2sat.out");
ifstream fin("2sat.in");
const int NMAX = 200010;

int n, m, lg, ok;
int S[NMAX], L[NMAX], R[NMAX];
bitset<NMAX> Viz, Poz, Neg;
vector<int> Graf[NMAX];

int nou(int val)
{
    return (val <= n ? val + n : val - n);
}

void dfs(int nod)
{
    Viz[nod] = true;
    for(auto x : Graf[nod])
        if(!Viz[x]) dfs(x);
    S[++lg] = nod;
}

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

        L[i] = x, R[i] = y;
        Graf[nou(x)].push_back(y);
        Graf[nou(y)].push_back(x);
    }

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

    for(int i=lg; i; i--)
        if(!Poz[nou(S[i])])
            Poz[S[i]] = true;
        else
            Neg[S[i]] = !Neg[nou(S[i])];

    for(int i=1; i<=m; i++)
        if(!Neg[L[i]] && !Neg[R[i]])
            { ok = 1; break; }

    if(ok) fout << -1 << '\n';
    else for(int i=1; i<=n; i++)
            fout << Neg[i] << ' ';
}