Cod sursa(job #3287149)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 16 martie 2025 17:29:16
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>

#define NMAX 100005

using namespace std;

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

int variables, expressions, no_components;
stack<int> s;
vector<int> edges[2 * NMAX], edges1[2 * NMAX];
int components[2 * NMAX];
bitset<2 * NMAX> visited;
vector<int> ans;

int real_idx(int x) {
    return x < 0 ? abs(x) + variables : x;
}

void dfs(int node) {
    visited[node] = 1;

    for (auto child: edges[node])
        if (!visited[child])
            dfs(child);

    s.push(node);
}

void dfs1(int node) {
    components[node] = no_components;

    for (auto child: edges1[node]) 
        if (components[child] == 0)
            dfs1(child);
}

int main() {

    f >> variables >> expressions;

    for (int i = 1; i <= expressions; i++) {
        int x, y;
        f >> x >> y;
        edges[real_idx(-x)].push_back(real_idx(y));
        edges[real_idx(-y)].push_back(real_idx(x));
        edges1[real_idx(x)].push_back(real_idx(-y));
        edges1[real_idx(y)].push_back(real_idx(-x));
    }

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

    while (!s.empty()) {
        int node = s.top();
        s.pop();
        if (!components[node]) {
            no_components++;
            dfs1(node);
        }
    }

    for (int i = 1; i <= variables; i++) {
        if (components[i] == components[i + variables]) {
            g << -1;
            return 0;
        } else {
            ans.push_back(components[i] > components[i + variables]);
        }
    }

    for (auto x : ans) g << x << " ";

    return 0;
}