Cod sursa(job #2645407)

Utilizator betybety bety bety Data 28 august 2020 10:37:35
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

#define Nmax 100005



using namespace std;

ifstream fin ("2sat.in");

ofstream fout ("2sat.out");



int x, y, nx, ny, n, m, k, c[2*Nmax], o[2*Nmax], viz[2*Nmax], s[Nmax];

vector <int> v[2*Nmax], vt[2*Nmax];

int cazi(int &x, int &nx)

{

    if(x<0)

    {

        nx=-x;

        x=-x+n;

    }

    else nx=x+n;

}



void dfs1(int x)

{

    viz[x]=1;

    for(auto it:v[x])

        if(!viz[it])

            dfs1(it);

    o[++k]=x;

}

void dfs2(int x)

{

    c[x]=k;

    for(auto it:vt[x])

        if(!c[it])

            dfs2(it);

}

int main()

{

    fin >> n >> m;

    for(int i=1;i<=m;i++)

    {

        fin >> x >> y;

        cazi(x, nx);

        cazi(y, ny);

        v[ny].push_back(x); vt[x].push_back(ny);

        v[nx].push_back(y); vt[y].push_back(nx);

    }

    for(int i=1;i<=2*n;i++)

        if(!viz[i])

            dfs1(i);

    k=0;

    for(int i=2*n;i>=1;i--)

        if(!c[o[i]])

        {

            k++;

            dfs2(o[i]);

        }

    for(int i=1;i<=n;i++)

        if(c[i]==c[i+n])

        {

            fout << -1;

            return 0;

        }

        else s[i] = c[i] > c[i+n];



    for(int i=1;i<=n;i++)

        fout << s[i] << ' ';

    return 0;

}