Pagini recente » Cod sursa (job #2045569) | Cod sursa (job #1171587) | Cod sursa (job #2162147) | Cod sursa (job #3152) | Cod sursa (job #602741)
Cod sursa(job #602741)
#include<stdio.h>
#include<stdlib.h>
#define N 200001
long n,m,a[N],b[N],i,*g[N],deg[N]={0},c[N],s[N],ss,v[N],l[N],q[N],sq=0,j,k,r,nr,ind,p[N],e[N],*d[N],ok=0;
void tarjan(long i,long *nr,long *ind)
{long j,r;
s[++ss]=i;
if(v[i]==0)
v[i]=1;
c[i]=(*ind);
l[i]=(*ind)++;
for(j=0;j<deg[i];j++)
if(c[g[i][j]]==0)
{tarjan(g[i][j],nr,ind);
if(l[i]>l[g[i][j]])
l[i]=l[g[i][j]];}
else
if(v[g[i][j]]==1&&l[i]>c[g[i][j]])
l[i]=c[g[i][j]];
if(c[i]==l[i])
{sq=0;
while(ss)
{r=s[ss--];
if(r!=i&&v[r]==1)
q[sq++]=r,v[r]=2;
else
break;}
if(v[i]==1)
v[i]=2,q[sq++]=i;
if(sq>0)
{d[++(*nr)]=(long*)malloc(sq*sizeof(long));
e[(*nr)]=sq;
for(j=0;j<sq;j++)
d[(*nr)][j]=q[j];}}}
int main()
{freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(i=1;i<=m;i++)
{scanf("%ld%ld",&a[i],&b[i]);
if(a[i]<0)
deg[n-a[i]]++;
else
deg[a[i]]++;
if(b[i]<0)
deg[n-b[i]]++;
else
deg[b[i]]++;}
for(j=1;j<=2*n;deg[j++]=0)
{g[j]=(long*)malloc(deg[j]*sizeof(long));
p[j]=2;}
for(k=1;k<=m;k++)
{if(a[k]<0)
a[k]=n-a[k];
if(b[k]<0)
b[k]=n-b[k];
if(a[k]>n)
g[a[k]-n][deg[a[k]-n]++]=b[k];
else
g[n+a[k]][deg[n+a[k]]++]=b[k];
if(b[k]>n)
g[b[k]-n][deg[b[k]-n]++]=a[k];
else
g[n+b[k]][deg[n+b[k]]++]=a[k];}
for(i=1;i<=2*n;i++)
if(!deg[i])
{p[i]=1;
if(i>n)
p[i-n]=0;
else
p[i+n]=0;}
nr=ind=ss=0;
for(i=1;i<=2*n;i++)
if(!c[i])
tarjan(i,&nr,&ind);
for(i=1;i<=nr;i++)
{k=2;
for(j=0;j<e[i];j++)
if(p[d[i][j]]!=2)
k=p[d[i][j]];
if(k!=2)
{for(j=0;j<e[i];j++)
if(p[d[i][j]]==2)
{if(!k)
{p[d[i][j]]=0;
if(d[i][j]>n)
p[d[i][j]-n]=1;
else
p[d[i][j]+n]=1;}
else
{p[d[i][j]]=1;
if(d[i][j]>n)
p[d[i][j]-n]=0;
else
p[d[i][j]+n]=0;}}
else
if(p[d[i][j]]!=2&&p[d[i][j]]!=k)
ok=1;}
else
{k=p[d[i-1][0]];
for(j=0;j<e[i];j++)
if(!k)
{p[d[i][j]]=0;
if(d[i][j]>n)
p[d[i][j]-n]=1;
else
p[d[i][j]+n]=1;}
else
{p[d[i][j]]=1;
if(d[i][j]>n)
p[d[i][j]-n]=0;
else
p[d[i][j]+n]=0;}}}
if(!ok)
{for(i=1;i<=n;i++)
printf("%d ",p[i]);}
else
printf("-1");
fclose(stdin);
fclose(stdout);
return 0;}