Cod sursa(job #2382630)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 18 martie 2019 15:51:57
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.68 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m,i,tip,k,cul[200010],o[200010];
vector<int> nodes[200010],g[2][200010];
bitset<200010> viz,done,r;


void dfs(int poz)
{
    viz[poz]=tip^1;
    if(tip)
    {
        nodes[k].push_back(poz);
        cul[poz]=k;
    }
    for(auto it:g[tip][poz])
        if(viz[it]==tip)
            dfs(it);
    if(!tip)
        o[++o[0]]=poz;
}

void go(int poz,int t)
{
    done[poz]=1;
    r[poz]=t;
    for(auto it:nodes[poz])
    {
        if(!done[cul[it^1]])
            go(cul[it^1],t^1);
        if(t)
            for(auto that:g[0][it])
                if(!done[cul[that]])
                    go(cul[that],1);
    }
    return ;
}

void inline muchie(int x,int y)
{
    g[0][x].push_back(y);
    g[1][y].push_back(x);
}

void inline rel(int x,int y)
{
    muchie(x,y  );
    muchie(y^1,x^1);
}

int main()
{
    fin>>n>>m;
    for(i=1; i<=m; i++)
    {
        int x,y;
        fin>>x>>y;
        x=(abs(x)-1)*2+(x<0);
        y=(abs(y)-1)*2+(y<0);
        rel(x^1,y);
    }
//    for(i=0;i<=7;i++)
//    {
//        cout<<i<<": ";
//        for(auto it:g[0][i])
//            cout<<it<<' ';cout<<'\n';
//    }
    tip=0;
    for(i=0; i<2*n; i++)
        if(!viz[i])
            dfs(i);
    tip=1;
    k=0;
//    for(i=-n;i<=n;i++)
//        cout<<i<<' '<<(abs(i)-1)*2+(i<0)<<'\n';
    for(i=o[0]; i; i--)
        if(viz[o[i]])
        {
            k++;
            dfs(o[i]);
        }
//    for(i=1;i<=o[0];i++)
//        cout<<o[i]<<' ';cout<<'\n';
//    cout<<"JEff\n";
//    for(i=1;i<=k;i++)
//    {
//        cout<<i<<": ";
//        for(auto it:nodes[i])
//            cout<<it<<' ';
//        cout<<'\n';
//    }
    go(1,1);
    for(i=1; i<=k; i++)
        if(!done[i])
            go(i,0);
    bool ok=0;
    for(i=0; i<2*n; i++)
        if(r[cul[i]]^r[cul[i^1]]==0)
            ok=1;
    for(i=0; i<2*n; i++)
        if(r[cul[i]])
            for(auto it:g[0][i])
                if(!r[cul[it]])
                    ok=1;
    if(ok)
    {
        for(i=1;i<=k;i++)
            done[i]=0;
        for(i=1; i<=k; i++)
            if(!done[i])
                go(i,0);
        ok=0;
        for(i=0; i<2*n; i++)
            if(r[cul[i]]^r[cul[i^1]]==0)
                ok=1;
        for(i=0; i<2*n; i++)
            if(r[cul[i]])
                for(auto it:g[0][i])
                    if(!r[cul[it]])
                        ok=1;
        if(ok)
        {
            fout<<-1;
            return 0;
        }
    }


    for(i=0; i<2*n; i+=2)
        fout<<r[cul[i]]<<' ';
    return 0;
}