Cod sursa(job #2595183)

Utilizator Rares31100Popa Rares Rares31100 Data 7 aprilie 2020 12:01:24
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
#define K100 100000

using namespace std;

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

int n,m,p;
int vf[4*K100+1],urm[4*K100+1],last[2*K100+2],nr;
int vf2[4*K100+1],urm2[4*K100+1],last2[2*K100+2];
int vf3[2*K100+2],urm3[2*K100+2],last3[2*K100+2],nrc;
int ord[2*K100+2],t;
bitset <2*K100+2> viz;
map <int,int> comp;
int val[K100+1];

void adauga(int nod,int vec)
{
    vf[++nr]=vec;
    urm[nr]=last[nod];
    last[nod]=nr;

    swap(nod,vec);

    vf2[nr]=vec;
    urm2[nr]=last2[nod];
    last2[nod]=nr;
}

void adaugaT(int nod,int nrc)
{
    vf3[++nr]=nod;
    urm3[nr]=last3[nrc];
    last3[nrc]=nr;
}

void dfs(int nod)
{
    viz[nod]=1;

    for(int k=last[nod];k;k=urm[k])
        if(!viz[ vf[k] ])
            dfs(vf[k]);

    ord[++t]=nod;
}

void dfst(int nod,int nrc)
{
    viz[nod]=1;
    adaugaT(nod,nrc);
    comp[nod]=nrc;

    for(int k=last2[nod];k;k=urm2[k])
        if(!viz[ vf2[k] ])
            dfst(vf2[k],nrc);
}

int main()
{
    in>>n>>m;
    p=n+1;

    for(int k=1,i,j;k<=m;k++)
    {
        in>>i>>j;
        adauga(p-i,p+j);
        adauga(p-j,p+i);
    }

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

    nr=0;viz=0;
    for(int i=n*2+1;i>=1;i--)
        if(!viz[ ord[i] ])
            dfst(ord[i],++nrc);

    for(int i=1;i<=n;i++)
        if(comp[p+i]==comp[p-i])
        {
            out<<-1;
            return 0;
        }

    for(int i=nrc;i>=1;i--)
        for(int k=last3[i];k;k=urm3[k])
        {
            int nod=abs(vf3[k]-p);

            if(!val[nod])
                val[nod]=(vf3[k]<p?1:2);
        }

    for(int i=1;i<=n;i++)
        out<<val[i]-1<<' ';

    return 0;
}