Cod sursa(job #528914)

Utilizator DraStiKDragos Oprica DraStiK Data 3 februarie 2011 20:19:01
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.75 kb
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

#define pb push_back
#define DIM 200005

int use[DIM],viz[DIM],postviz[DIM],grd[DIM],v[DIM];
vector <int> g[DIM],gt[DIM],ct[DIM];
int n,m,ctc,nrc,ok;
queue <int> q;

inline int neg (int x)
{
    if (x<=n)
        return x+n;
    return x-n;
}

inline int get_id (int x)
{
    if (x<0)
        return n-x;
    return x;
}

void read ()
{
    int i,x,y;

    scanf ("%d%d",&n,&m);
    for (i=1; i<=m; ++i)
    {
        scanf ("%d%d",&x,&y);
        g[neg (get_id (x))].pb (get_id (y));
        g[neg (get_id (y))].pb (get_id (x));
        gt[get_id (y)].pb (neg (get_id (x)));
        gt[get_id (x)].pb (neg (get_id (y)));
    }
}

void df (int nod)
{
    vector <int> :: iterator it;

    viz[nod]=1;
    for (it=g[nod].begin (); it!=g[nod].end (); ++it)
        if (!viz[*it])
            df (*it);
    postviz[++nrc]=nod;
}

void dft (int nod)
{
    vector <int> :: iterator it;

    viz[nod]=0; use[nod]=ctc; ct[ctc].pb (nod);
    for (it=gt[nod].begin (); it!=gt[nod].end (); ++it)
        if (viz[*it])
            dft (*it);
}

void solve ()
{
    vector <int> :: iterator it,it_n;
    int i,nod,var;

    memset (v,-1,sizeof (v));
    for (i=1; i<=(n<<1); ++i)
        if (!viz[i])
            df (i);
    for (i=(n<<1); i>=1; --i)
        if (viz[postviz[i]])
        {
            ++ctc;
            dft (postviz[i]);
        }
    for (i=1; i<=(n<<1); ++i)
        if (use[i]==use[i+n])
        {
            ok=1;
            return ;
        }
    for (i=1; i<=(n<<1); ++i)
        for (it=g[i].begin (); it!=g[i].end (); ++it)
            if (use[i]!=use[*it])
                ++grd[use[*it]];
    for (i=1; i<=ctc; ++i)
        if (!grd[i])
            q.push (i);
    for ( ; !q.empty (); q.pop ())
    {
        nod=q.front ();
        for (it=ct[nod].begin (); it!=ct[nod].end (); ++it)
        {
            if (*it<=n)
                var=*it;
            else
                var=*it-n;
            if (v[var]==-1)
                if (*it<=n)
                    v[var]=0;
                else
                    v[var]=1;
        }
        for (it=ct[nod].begin (); it!=ct[nod].end (); ++it)
            for (it_n=g[*it].begin (); it_n!=g[*it].end (); ++it_n)
                if (use[*it]!=use[*it_n])
                    if (--grd[use[*it_n]]==0)
                        q.push (use[*it_n]);
    }
}

void print ()
{
    int i;

    if (ok)
        printf ("-1");
    else
        for (i=1; i<=n; ++i)
            printf ("%d ",v[i]);
}

int main ()
{
    freopen ("2sat.in","r",stdin);
    freopen ("2sat.out","w",stdout);

    read ();
    solve ();
    print ();

    return 0;
}