Cod sursa(job #2730131)

Utilizator StanCatalinStanCatalin StanCatalin Data 25 martie 2021 20:00:16
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

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

const int dim = 100005;

int n,m, cnt,dap;
int val[2 * dim + 5];
int completat[2 * dim + 5];
vector<int> vec[2 * dim + 5];
vector<int> vec2[2 * dim + 5];
vector<int> componente[2 * dim + 5];
int viz[2 * dim + 5],q[2 * dim + 5], st;

void DFS1(int nod)
{
    viz[nod] = 1;

    for (auto y:vec[nod])
    {
        if (!viz[y])
        {
            DFS1(y);
        }
    }
    q[++st] = nod;
}

void DFS2(int nod)
{
    componente[cnt].push_back(nod);
    viz[nod] = 1;

    if (!completat[nod])
    {
        completat[nod] = 1;
        val[nod] = 0;
        completat[- nod + dim + dim] = 1;
        val[- nod + dim + dim] = 1;
    }
    else
    {
        if (val[nod])
        {
            dap = 1;
        }
    }
    for (auto y:vec2[nod])
    {
        if (!viz[y])
        {
            DFS2(y);
        }
    }
}

int main()
{
    in >> n >> m;
    int x,y;
    while (m--)
    {
        in >> x >> y;
        vec[-x + dim].push_back(y + dim);
        vec[-y + dim].push_back(x + dim);

        vec2[y + dim].push_back(-x + dim);
        vec2[x + dim].push_back(-y + dim);
    }

    for (int i=-n; i<=n; i++)
    {
        if (!viz[i + dim])
        {
            DFS1(i + dim);
        }
    }
    memset(viz,0,sizeof(viz));

    for (int i=st; i>=1; i--)
    {
        if (completat[q[i]])
        {
            continue;
        }
        if (!viz[q[i]])
        {
            cnt++;
            DFS2(q[i]);
        }
    }
    if (dap == 1) out << "-1\n";
    else
    {
        for (int i=1; i<=n; i++)
        {
            out << val[i + dim] << " ";
        }
    }
    return 0;
}