Cod sursa(job #2986160)

Utilizator NuSuntRomanIspir Alexandru NuSuntRoman Data 27 februarie 2023 20:32:37
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <bits/stdc++.h>

const int NMAX = 4e5 + 5, SHIFT = 2e5 + 5;

int n, m, k, f[NMAX], col[NMAX], sol[NMAX];
std :: vector < int > G[NMAX], A[NMAX], P[NMAX];
std :: stack < int > st;

#define G (G + SHIFT)
#define A (A + SHIFT)

#define f (f + SHIFT)
#define sol (sol + SHIFT)
#define col (col + SHIFT)

void DFS(int node) {
    f[node] = true;

    for (int i = 0; i < G[node].size(); ++ i) {
        int u = G[node][i];

        if (f[u] == false)
            DFS(u);
    }

    st.push(node);
    return;
}

void DFSUtil(int node) {
    col[node] = k;
    f[node] = true;

    for (int i = 0; i < A[node].size(); ++ i) {
        int u = A[node][i];

        if (f[u] == false)
            DFSUtil(u);
    }

    return;
}

void solve(int node, int c) {
    f[node] = true;

    for (int i = 0; i < P[node].size(); ++ i) {
        int u = P[node][i];

        sol[u] = c;
    }

    for (int i = 0; i < P[node].size(); ++ i) {
        int u = P[node][i];

        if (f[col[-u]] == false)
            solve(col[-u], !c);
    }

    return;
}

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

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

    for (int i = 1, u, v; i <= m; ++ i) {
        fin >> u >> v;

        G[u].push_back(-v);
        G[v].push_back(-u);

        A[-v].push_back(u);
        A[-u].push_back(v);
    }

    for (int i = -n; i <= n; ++ i)
        if (f[i] == false)
            DFS(i);

    for (int i = -n; i <= n; ++ i)
        f[i] = false;

    while (!st.empty()) {
        int u = st.top();

        if (col[u] == 0) {
            ++ k;
            DFSUtil(u);
        }

        st.pop();
    }

    for (int i = 1; i <= n; ++ i)
        if (col[i] == col[-i]) {
            fout << "-1\n";
            return 0;
        }

    for (int i = -n; i <= n; ++ i)
        P[col[i]].push_back(i);

    for (int i = 1; i <= k; ++ i)
        f[i] = false;

    for (int i = 1; i <= k; ++ i)
        if (f[i] == false)
            solve(i, +1);

    for (int i = 1; i <= n; ++ i)
        fout << sol[i] << " ";

    return 0;
}