Pagini recente » Cod sursa (job #296716) | Cod sursa (job #2946484) | Cod sursa (job #550116) | Cod sursa (job #2881457) | Cod sursa (job #477094)
Cod sursa(job #477094)
#include <cstdio>
#define DM 400005
int n,m,sol[DM],ord[DM],nr;
bool viz[DM],ok=true;
struct nod {
int x;
nod *urm;
} *g[DM],*gt[DM];
inline int non(int a) {
return (a>n) ? a-n: n+a;
}
void dfs(int sursa) {
if(viz[sursa]) return;
nod *p;
viz[sursa]=true;
for(p=g[sursa]; p!=NULL; p=p->urm)
if(!viz[p->x]) dfs(p->x);
ord[++nr]=sursa;
}
void dfs_2(int sursa) {
if(!viz[sursa]) return;
nod *p;
viz[sursa]=false;
if(sol[sursa]) ok=false;//nu avem solutie
sol[non(sursa)]=1;
for(p=gt[sursa]; p!=NULL; p=p->urm)
if(viz[p->x]) dfs_2(p->x);
}
void adaugare(int x,int y,bool a) {
nod *p;
p=new nod;
p->x=y;
if(a) {
p->urm=g[x];
g[x]=p;
}else {
p->urm=gt[x];
gt[x]=p;
}
}
int main()
{
int i,x,y;
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1; i<=m; ++i) {
scanf("%d %d",&x,&y);
x=(x<0)?n-x:x;
y=(y<0)?n-y:y;
adaugare(non(x),y,true);
adaugare(non(y),x,true);
adaugare(x,non(y),false);
adaugare(y,non(x),false);
}
for(i=1; i<=n+n; ++i)
if(!viz[i]) dfs(i);
for(i=n+n;i;--i)
if(viz[ord[i]] && viz[non(ord[i])])
dfs_2(ord[i]);
if(!ok) printf("-1");
else for(i=1; i<=n; ++i) printf("%d ",sol[i]);
return 0;
}