Cod sursa(job #2823044)

Utilizator roberttrutaTruta Robert roberttruta Data 26 decembrie 2021 18:33:35
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.5 kb
#include <fstream>
#include <vector>
//Solutie O(n*m)
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");

vector <int> v[200005];
int atrib[200005], q[200005];

int main()
{
    int n,m,i,j,t=0,p=1,OK=1,x,y;
    f>>n>>m;
    for(i=1; i<= 2*n; i++)
        atrib[i] = -1;
    for(i=1; i<=m; i++)
    {
        f>>x>>y;
        if(x>0)
            x += n;
        else
            x = -1*x;
        if(y>0)
            y += n;
        else
            y = -1*y;
        v[x].push_back(y);
        v[y].push_back(x);
    }

    for(i=1; i<=n; i++)
        if(atrib[i] == -1)
        {
            atrib[i] = 1;
            atrib[i+n] = 0;
            q[++t] = i;
            while(p <= t)
            {
                int choose = q[p];
                if(choose > n)
                    choose -= n;
                else
                    choose +=n;

                for(j=0; j<v[choose].size(); j++)
                {
                    int constrain = v[choose][j];
                    if(atrib[constrain] == 0)
                    {
                        if(q[1] > n)
                        {
                            OK = 0;
                            t = 0;
                            break;
                        }
                        while(t>0)
                        {
                            atrib[q[t]] = -1;
                            if(q[t] > n)
                                atrib[q[t] - n] = -1;
                            else
                                atrib[q[t] + n] = -1;
                            t--;
                        }
                        atrib[i] = 0;
                        atrib[i+n] = 1;
                        p=0;
                        q[++t] = i+n;
                        break;
                    }
                    if(atrib[constrain] == -1)
                    {
                        atrib[constrain] = 1;
                        q[++t] = constrain;
                        if(constrain > n)
                            constrain -= n;
                        else
                            constrain +=n;
                        atrib[constrain] = 0;
                    }
                }
                p++;
            }
            t=0;
            p=1;
            if(OK == 0)
                break;
        }
    if(OK == 1)
    {
        for(i=n+1; i<= 2*n; i++)
            g<<atrib[i]<<' ';
    }
    else
        g<<-1;
    return 0;
}