Pagini recente » Cod sursa (job #1607540) | Cod sursa (job #2073552) | Cod sursa (job #2846043) | Statistici Petrescu Alexandru-Antonio (AlexAntonio250) | Cod sursa (job #1735575)
#include <stdio.h>
#include <stdlib.h>
struct list
{
int x;
list * next;
};
char u[200009],f[200009];
int s[200009],n,m,x,y,k,i;
list * g[200009],* gt[200009];
int neg(int x)
{
if (x<=n)
return n+x;
return x-n;
}
void add(int x,int y)
{
if (x<0) x=n-x;
if (y<0) y=n-y;
list * p= (list *) malloc(sizeof(list));
p->x=x;
p->next=g[neg(y)];
g[neg(y)]=p;
p= (list *) malloc(sizeof(list));
p->x=y;
p->next=g[neg(x)];
g[neg(x)]=p;
p= (list *) malloc(sizeof(list));
p->x=neg(y);
p->next=gt[x];
gt[x]=p;
p= (list *) malloc(sizeof(list));
p->x=neg(x);
p->next=gt[y];
gt[y]=p;
}
void dfs(int v)
{
u[v]=1;
for (list * p = g[v]; p ;p=p->next)
if (!u[p->x]) dfs(p->x);
s[k++]=v;
}
void tdfs(int v)
{
u[v]=0;
f[neg(v)]=1;
for (list * p = gt[v]; p ;p=p->next)
if (u[p->x]) tdfs(p->x);
}
int main()
{
FILE * kfgd = freopen("2sat.in","r",stdin);
kfgd = freopen("2sat.out","w",stdout);
scanf("%d%d",&n,&m);
while (m--)
{
scanf("%d%d",&x,&y);
add(x,y);
}
for (i=1;i<=2*n;++i)
if (!u[i]) dfs(i);
for (i=2*n;i>0;--i)
if (u[s[i]] && u[neg(s[i])])
tdfs(s[i]);
for (i=1;i<=2*n;++i)
if (f[i]==f[neg(i)])
{
puts("-1");
return 0;
}
for (i=1;i<=n;++i)
printf("%d ",f[i]);
return 0;
}