Cod sursa(job #3171712)

Utilizator Kln1000Ciobanu Bogdan Kln1000 Data 19 noiembrie 2023 14:33:05
Problema 2SAT Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <vector>

constexpr unsigned NM = 100010;

std::vector<int> v[NM<<1];
int n,m,val[NM<<1],E1[NM<<1],E2[NM<<1],viz[NM<<1],top[NM<<1];

#define viz (viz+NM)
#define val (val+NM)
#define v (v+NM)

void dfs(int nod)
{
    viz[nod] = true;
    for (auto i : v[nod]) {
        if (!viz[i]) {
            dfs(i);
        }
    }

    top[++top[0]] = nod;
}

int main () {
    std::ifstream f("2sat.in");
    std::ofstream t("2sat.out");

    f >> n >> m;

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

        E1[i]=x;
        E2[i]=y;

        v[x].push_back(-y);
        v[y].push_back(-x);
    }

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

    for (int i = 1; i <= (n << 1); ++i) {
        if(!val[top[i]] and !val[-top[i]]) {
            val[-top[i]] = 1;
        }
    }

    for (int x, y, i = 1; i <= m; ++i) {
        x = E1[i];
        y = E2[i];
        if((val[-x] and !val[y]) or (val[-y] and !val[x])) {
            t << "-1";
            return 0;
        }
    }

    for (int i = 1; i <= n; ++i) {
        t << val[i] << " ";
    }

    return 0;
}