Cod sursa(job #992975)
#include<fstream>
using namespace std;
typedef struct celula{
int nod;
celula *next;
}*lista;
lista graf[200005],v,tgraf[200005],gtc[200005],tgtc[200005];
int i,n,m,x,y,comp[200005],st[200005],levst,nrcomp,gin[200005],gout[200005],adevar[200005];
bool viz[200005];
int negat(int x) { if (x<0) return(-x); else return(n+x); }
int pozitiv(int x) { if (x<0) return(n-x); else return(x); }
void dfs(int nod) {
viz[nod]=1;
for (lista p=graf[nod]; p; p=p->next)
if (viz[p->nod]==0) dfs(p->nod);
++levst; st[levst]=nod;
}
void dfs1(int nod) {
comp[nod]=nrcomp;
for (lista p=tgraf[nod]; p; p=p->next)
if (comp[p->nod]==0) dfs1(p->nod);
}
bool nuemuchia(int i, int j) {
bool ok=1;
for (lista p=gtc[i]; p; p=p->next)
if (p->nod==j) { ok=0; break; }
return(j);
}
int main(void) {
ifstream fin("2sat.in");
ofstream fout("2sat.out");
fin>>n>>m;
for (i=1; i<=m; ++i) {
int x1,y1; fin>>x1>>y1; x=negat(x1); y=pozitiv(y1);
v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
v=new celula; v->nod=x; v->next=tgraf[y]; tgraf[y]=v;
x=negat(y1); y=pozitiv(x1);
v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
v=new celula; v->nod=x; v->next=tgraf[y]; tgraf[y]=v;
}
n*=2; bool ok=1;
for (i=1; i<=n; ++i)
if (viz[i]==0) dfs(i);
for (i=n; i>=1; --i)
if (comp[st[i]]==0) { ++nrcomp; dfs1(st[i]); }
for (i=1; i<=n; ++i)
for (v=graf[i]; v; v=v->next)
if (comp[i]!=comp[v->nod]&&nuemuchia(i,v->nod)) {
++gout[i]; ++gin[v->nod];
lista p=new celula; p->nod=comp[v->nod]; p->next=gtc[comp[i]]; gtc[comp[i]]=p;
p=new celula; p->nod=comp[i]; p->next=tgtc[comp[v->nod]]; tgtc[comp[v->nod]]=p;
}
else if (v->nod-n==i) ok=0;
if (ok==0) { fout<<"-1"; return(0); }
while (ok) {
ok=0;
for (i=1; i<=nrcomp; ++i)
if (viz[i]==1&&gout[i]==0) adevar[i]=1;
for (i=1; i<=nrcomp; ++i)
if (viz[i]==1&&gin[i]==0) {
ok=1; viz[i]=0;
for (lista p=gtc[i]; p; p=p->next) --gin[p->nod];
}
else if (viz[i]==1&&gout[i]==0) {
viz[i]=0; ok=1;
for (lista p=tgtc[i]; p; p=p->next) --gout[p->nod];
}
}
for (i=1; i<=n/2; ++i) fout<<adevar[comp[i]]<<" ";
return(0);
}