Cod sursa(job #2200429)

Utilizator cristina_borzaCristina Borza cristina_borza Data 1 mai 2018 13:20:56
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("2sat.in");
ofstream g ("2sat.out");

const int Dim = 5e5 + 5;

int ctc[Dim], sortop[Dim];
int n, m, sz;

bool viz[Dim];

vector <int> G[Dim], Gt[Dim];

int idx (int val) {
    if (val > 0)
        return val;
    return n - val;
}

void dfs (int node) {
    viz[node] = 1;
    for (auto son: G[node]) {
        if (viz[son] == 0) {
            dfs (son);
        }
    }

    sortop[++sz] = node;
}

void dfs_back (int node, int comp) {
    ctc[node] = comp;
    viz[node] = 1;

    for (auto son: Gt[node]) {
        if (viz[son] == 0) {
            dfs_back (son, comp);
        }
    }
}

int main ( ) {
    f >> n >> m;
    for (int i = 1; i <= m; ++ i) {
        int x, y;
        f >> x >> y;

        G[idx(-x)].push_back (idx(y));
        G[idx(-y)].push_back (idx(x));

        Gt[idx(y)].push_back (idx(-x));
        Gt[idx(x)].push_back (idx(-y));
    }

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

    memset (viz, 0, sizeof(viz));
    int comp = 0;

    for (int i = 2 * n; i >= 1; -- i) {
        if (!viz[sortop[i]]) {
            ++comp;
            dfs_back (sortop[i], comp);
        }
    }

    for (int i = 1; i <= n; ++ i) {
        if (ctc[i] == ctc[n + i]) {
            g << -1 << '\n';
            return 0;
        }
    }

    for (int i = 1; i <= n; ++ i) {
        if (ctc[i] < ctc[n + i])
            g << 0 << " ";

        else
            g << 1 << " ";
    }
    return 0;
}