Pagini recente » Cod sursa (job #1107757) | Cod sursa (job #574422) | Cod sursa (job #800086) | Cod sursa (job #907467) | Cod sursa (job #993014)
Cod sursa(job #993014)
#include<fstream>
using namespace std;
typedef struct celula{
int nod;
celula *next;
}*lista;
lista graf[200005],v,tgraf[200005];
int i,n,m,x,y,comp[200005],st[200005],levst,nrcomp,sol[200005];
bool viz[200005],ok=1;
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); }
int opus(int x) { if (x>n) return(x-n); else return(n+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;
if (sol[nod]) ok=0;
sol[opus(nod)]=1;
for (lista p=tgraf[nod]; p; p=p->next)
if (comp[p->nod]==0&&ok) dfs1(p->nod);
}
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;
}
for (i=1; i<=2*n; ++i)
if (viz[i]==0) dfs(i);
for (i=2*n; i>=1; --i)
if (comp[st[i]]==0&&comp[opus(st[i])]==0) { ++nrcomp; dfs1(st[i]); }
if (ok==0) fout<<"-1";
else for (i=1; i<=n; ++i) fout<<sol[i]<<" ";
return(0);
}