Cod sursa(job #3357365)

Utilizator VladPislaruPislaru Vlad Rares VladPislaru Data 9 iunie 2026 09:37:21
Problema 2SAT Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.63 kb
#include <fstream>
#include <vector>
#include <map>

using namespace std;

ifstream cin ("2sat.in");
ofstream cout ("2sat.out");

vector<vector<int>> gr(200100);
vector<vector<int>> inv(200100);

vector<bool> used(200100);
vector<bool> USED(200100);

map<int, bool> M;

vector<int> now;
vector<int> NOW;

vector<vector<int>> comp(200100);
vector<int> COMP(200100);
int cont = 0;

vector<int> ans(200100);

void dfs(int root) {
    M[root] = true;
    now.push_back(root);
    for (auto &x : gr[root]) {
        if (!used[x]) {
            used[x] = true;
            dfs(x);
        }
    }
}

void DFS(int root) {
    COMP[root] = cont;
    NOW.push_back(root);
    for (auto &x : inv[root]) {
        if (M[x] && !USED[x]) {
            USED[x] = true;
            DFS(x);
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= m; i++) {
        int a, b;
        cin >> a >> b;

        int A = -a;
        int B = -b;

        if (a < 0) {
            a = -a;
            a += n;
        } else {
            A = -A;
            A += n;
        }
        if (b < 0) {
            b = -b;
            b += n;
        } else {
            B = -B;
            B += n;
        }

        gr[A].push_back(b);
        gr[B].push_back(a);

        inv[b].push_back(A);
        inv[a].push_back(B);
    }

    for (int i = 1; i <= 2 * n; i++) {
        if (!used[i]) {
            now.clear();
            M.clear();
            used[i] = true;
            dfs(i);
            for (auto &x : now) {
                if (!USED[x]) {
                    NOW.clear();
                    cont++;
                    USED[x] = true;
                    DFS(x);
                    comp[cont] = NOW;
                }
            }
        }
    }

    for (int i = n + 1; i <= 2 * n; i++) {
        if (COMP[i] == COMP[i - n]) {
            cout << -1;
            return 0;
        }
    }

    for (int i = 1; i <= cont; i++) {
        ans[i] = -1;
    }

    for (int i = 1; i <= cont; i++) {
        if (ans[i] == -1) {
            ans[i] = 0;
        }
        for (auto &x : comp[i]) {
            int opus;
            if (x > n) {
                opus = x - n;
            } else {
                opus = x + n;
            }

            if (ans[COMP[opus]] == -1) {
                ans[COMP[opus]] = ans[i] | 1;
            } else {
                if (ans[COMP[opus]] == ans[i]) {
                    cout << -1;
                    return 0;
                }
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        cout << ans[COMP[i]] << " ";
    }

    return 0;
}