Cod sursa(job #1147912)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 20 martie 2014 11:23:18
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <list>
#define fori(l) for(list<int>::iterator it=l.begin();it!=l.end();++it)
using namespace std;
int n,m,st[200100],sti;
list<int> g[200100],t[200100];
bool v[200100],b[200100],nvalid;
inline int nd(int a)
{
    if(a>0)
        return a;
    return n-a;
}
inline int non(int a)
{
    if(a<=n)
        return a+n;
    return a-n;
}
void dfsg(int nod)
{
    v[nod]=1;
    fori(g[nod])
        if(!v[*it])
            dfsg(*it);
    st[sti++]=nod;
}
void dfst(int nod)
{
    v[nod]=0;
    if(b[nod])
        nvalid=1;
    b[non(nod)]=1;
    fori(t[nod])
        if(v[*it])
            dfst(*it);
}
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int main()
{
    int i,j;
    fin>>n>>m;
    while(m--)
    {
        fin>>i>>j;
        i=nd(i);
        j=nd(j);
        g[non(i)].push_back(j);
        g[non(j)].push_back(i);
        t[j].push_back(non(i));
        t[i].push_back(non(j));
    }
    for(i=1;i<=n<<1;++i)
        if(!v[i])
            dfsg(i);
    while(sti--)
        if(v[st[sti]]&&v[non(st[sti])])
            dfst(st[sti]);
    if(nvalid)
        fout<<"-1";
    else
        for(i=1;i<=n;++i)
            fout<<b[i]<<" ";
    fout<<"\n";
    return 0;
}