Cod sursa(job #3143052)

Utilizator RolandPetreanPetrean Roland RolandPetrean Data 27 iulie 2023 13:13:54
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("2sat.in");
ofstream fout("2sat.out");

const int N = 2e5+5;
vector<int> g[N], g1[N];
bool ans[N];

bool vis[N];
vector<int> order;
void dfs1(int v) {
    vis[v] = true;
    for (int u : g[v]) {
        if (!vis[u]) dfs1(u);
    }
    order.push_back(v);
}

int curr=0;
int ctc[N];
void dfs2(int v) {
    ctc[v] = curr;
    for (int u : g1[v]) {
        if (!ctc[u]) dfs2(u);
    }
}

int main() {
    int n, m;
    fin>>n>>m;

    for (int i=0; i<m; ++i) {
        int a, b;
        fin>>a>>b;

        if (a<0) a = -2*a-1;
        else a = 2*a;
        if (b<0) b = -2*b-1;
        else b = 2*b;

        g[a + (a&1 ? 1 : -1)].push_back(b);
        g[b + (b&1 ? 1 : -1)].push_back(a);
    }

    for (int i=1; i<=2*n; ++i) {
        for (int j : g[i]) g1[j].push_back(i);
    }

    for (int i=1; i<=2*n; ++i) {
        if (!vis[i]) dfs1(i);
    }
    reverse(order.begin(), order.end());

    for (int v : order) {
        if (!ctc[v]) {
            ++curr;
            dfs2(v);
        }
    }

    bool ok = true;
    for (int i=1; i<=n; ++i) {
        ok &= (ctc[2*i] != ctc[2*i-1]);
    }

    if (!ok) {
        fout<<"-1";
        return 0;
    }

    for (int i=1; i<=n; ++i) {
        if (ctc[2*i] > ctc[2*i-1]) ans[i] = 1;
        fout<<ans[i]<<" ";
    }

}