Cod sursa(job #2797791)

Utilizator seburebu111Mustata Dumtru Sebastian seburebu111 Data 10 noiembrie 2021 16:42:12
Problema 2SAT Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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


const int N=200005;

int n, m;
bool viz1[N], viz2[N];
vector<bool> rasp;
vector<int> suc[N];
vector<int> pred[N];
vector<int> top;
int ctc[N], nrctc;

void dfs1(int x)
{
    viz1[x]=1;
    for(auto y: suc[x])
        if(!viz1[y])
            dfs1(y);
    top.push_back(x);
}

void dfs2(int x)
{
    viz2[x]=1;
    ctc[x]=nrctc;
    for(auto y: pred[x])
        if(!viz2[y])
            dfs2(y);
}

int main()
{
    int x, y;
    in>>n>>m;
    for(int i=1; i<=m; i++)
    {
        in>>x>>y;

        int a, b, na, nb;

        if(x>0)
        {
            a=2*x;
            na=2*x+1;
        }else
        {
            a=-2*x+1;
            na=-2*x;
        }

        if(y>0)
        {
            b=2*y;
            nb=2*y+1;
        }else
        {
            b=-2*y+1;
            nb=-2*y;
        }

        suc[na].push_back(b);
        pred[b].push_back(na);

        suc[nb].push_back(a);
        pred[a].push_back(nb);
    }

    for(int i=2; i<=2*n+1; i++)
        if(!viz1[i])
            dfs1(i);

    for(int i=2*n; i>=0; i--)
    {
        if(!viz2[top[i]])
        {
            dfs2(top[i]);
            nrctc++;
        }
    }

    for(int i=2; i<=2*n; i+=2)
    {
        if(ctc[i]==ctc[i+1])
        {
            cout<<"-1";
            return 0;
        }

        bool r=0;
        if(ctc[i]>ctc[i+1])
            r=1;
        rasp.push_back(r);
    }

    for(auto i:rasp)
        out<<i<<' ';

    return 0;
}