Cod sursa(job #3249833)

Utilizator Alex_BerbescuBerbescu Alexandru Alex_Berbescu Data 18 octombrie 2024 09:35:33
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
using namespace std;

const int dim = 1e5 + 55;
int n, m, x[dim], y[dim], counter, conex[2 * dim + 55];
bool sol[dim], ok = true;
vector<int> noduri[2 * dim + 55], nodurigt[2 * dim + 55];
bitset<2 * dim> viz;
stack<int> stiva;

void dfs(int nod) {
    viz[nod] = 1;
    for (auto it : noduri[nod]) {
        if (!viz[it]) {
            dfs(it);
        }
    }
    stiva.push(nod);
}
int neg(int valu)
{
    if(valu > n)
    {
        valu -= n;
    }
    else
    {
        valu += n;
    }
    return valu;
}
void dfsdoi(int nod) {
    viz[nod] = 1;
    if(sol[nod] == true)
    {
        ok = false;
    }
    sol[neg(nod)] = 1;
    for (auto it : nodurigt[nod]) {
        if (!viz[it]) {
            dfsdoi(it);
        }
    }
}

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

int main() {
    fin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        fin >> x[i] >> y[i];
        if(x[i] < 0)
        {
            x[i] = n - x[i];
        }
        if(y[i] < 0)
        {
            y[i] = n - y[i];
        }
        noduri[neg(x[i])].push_back(y[i]);
        noduri[neg(y[i])].push_back(x[i]);
        nodurigt[x[i]].push_back(neg(y[i]));
        nodurigt[y[i]].push_back(neg(x[i]));
    }

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

   viz.reset();
    while (!stiva.empty()) {
        int val = stiva.top();
        stiva.pop();
        if (!viz[val]) {
            counter++;
            dfsdoi(val);
        }
    }
   if(ok == 1)
   {
       for(int i = 1; i <= n; ++i)
       {
           fout << sol[i] << " ";
       }
   }

    return 0;
}