Cod sursa(job #2668042)

Utilizator racleta31Andreican Rares racleta31 Data 4 noiembrie 2020 13:22:58
Problema 2SAT Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.91 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int nmax=1e5+1;
const int mmax=2e5+1;
vector <int> vec[2*nmax];
vector <int> vectranspus[2*nmax];
int minime[nmax];
int vizi[nmax*2], postord[2*nmax], componenta[2*nmax];
queue <int> q;
int n, m, marime, nrc;
int fr[2*nmax];
void DFS(int x)
{
    vizi[x]=1;
    for(int i=0; i<vec[x].size(); i++)
    {
        if(!vizi[vec[x][i]])
        {
            DFS(vec[x][i]);
        }
    }
    postord[++marime]=x;
}
void DFST(int x)
{

    componenta[x]=nrc;
    vizi[x]=0;
    for(int i=0; i<vectranspus[x].size(); i++)
    {
        if(vizi[vectranspus[x][i]])
        {
            vizi[vectranspus[x][i]]=0;

            DFST(vectranspus[x][i]);
        }
    }
}
void rezolvare()
{
        for(int i=1;i<=2*n;i++)
    {
        if(vectranspus[i].size()==0)
        {
            q.push(i);
        }
        for(int j=0;j<vectranspus[i].size();j++)
        {

            if(vectranspus[i][j] == componenta[i])
            {
                vectranspus[i][j]=0;
            }
        }
    }
    while(q.size())
    {
        int curent =q.front();
        q.pop();


        if(curent > n)
        {
            if(fr[curent-n] == 0)
            {fr[curent-n]=3;
            curent-=n;}
        }

        else
        {
            if(fr[curent]== 0)
         {

         fr[curent]=2;
        }
        }


        for(int i=1;i<=2*n;i++)
        {
            bool ok = 0;
            if(vectranspus[i].size())
            {
                for(int j=0;j<vectranspus[i].size();j++)
                {
                    if(vectranspus[i][j] == componenta[curent])
                    {
                        vectranspus[i][j] = 0;
                    }
                    else
                    {if(vectranspus[i][j] == componenta[curent + n])
                    {
                        vectranspus[i][j] = 0;
                    }
                    else
                    {
                        if(vectranspus[i][j])
                        {
                            ok = 1;
                        }

                    }
                    }
                }
            }
            else
            {
                ok = 1;
            }
            if(ok == 0)
            {
                q.push(i);
                vectranspus[i].clear();
            }
        }
    }

}
int main()
{

    in>>n>>m;
    for(int i=1; i<=n; i++)
    {
        minime[i]=n+i;
    }
    for(int i=1; i<=m; i++)
    {
        int x, y, minx, miny;
        in>>x>>y;
        if(x<0)
        {
            minx=x*-1;
            x*=-1;
            x+=n;

        }
        else
        {
            minx=n+x;
        }
        if(y<0)
        {
            miny=y*-1;
            y*=-1;
            y+=n;

        }
        else
        {
            miny=n+y;
        }
        minime[x]=minx;
        minime[y]=miny;
        vec[minx].push_back(y);
        vec[miny].push_back(x);
        vectranspus[y].push_back(minx);
        vectranspus[x].push_back(miny);
    }
    for(int i=1; i<=2*n; i++)
    {
        if(!vizi[i])
        {
            DFS(i);
        }
    }
    for(int i=2*n; i>0; i--)
    {

        if(vizi[postord[i]])
        {
            nrc++;
            DFST(postord[i]);
        }
    }
    for(int i=1; i<=2*n; i++)
    {
        componenta[i]*=-1;

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


        if(componenta[i] == componenta[minime[i]])
        {
            out<<"-1";
            return 0;
        }
        for(int j=0; j<vectranspus[i].size(); j++)
        {

            vectranspus[i][j]=componenta[vectranspus[i][j]];

        }
    }
    rezolvare();
    for(int i=1;i<=n;i++)
    {
        out<<fr[i]-2<<" ";
    }

    return 0;
}