Cod sursa(job #599386)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 28 iunie 2011 16:45:33
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.25 kb
#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,l[N],q[N],sq,j,k,r,nr,ind,*d[N],e[N],t,viz[N];
int ok,p[N],v[N],vazut[N]={0},val=0;

void tarjan(long i,long *nr,long *ind,long *d[N],long e[N])
{long j,r;
s[++ss]=i;
if(!v[i])
      v[i]=1;
c[i]=(*ind);
l[i]=(*ind)++;
for(j=0;j<deg[i];j++)
if(!c[g[i][j]])
      {tarjan(g[i][j],nr,ind,d,e);
      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)
             q[++sq]=i,v[i]=2;
      if(sq>0)
             {(*nr)++;
             d[(*nr)]=(long*)malloc((sq+1)*sizeof(long));
             for(j=1;j<=sq;j++)
                     d[(*nr)][j]=q[j];
             e[(*nr)]=sq;}}}
             
void ts(long *d[N],long i,int *val)
{long j,k,l;
vazut[i]=1;
for(j=1;j<=nr;j++)
if(!vazut[j])
       {for(k=1;k<=e[j];k++)
             {for(l=0;l<deg[i];l++)
             if(g[i][l]==d[j][k])
                    ts(d,j,val);
             break;}
       break;}
if(!(*val))
       {k=0;
       for(j=1;j<=e[i];j++)
       if(p[d[i][j]]==2)
             {p[d[i][j]]=0;
             if(d[i][j]>n)
                     p[d[i][j]-n]=1;
             else
                     p[d[i][j]+n]=1;}
       else
             k++;
       if(k==e[i])
             (*val)=p[d[i][k]];
       else
             (*val)=0;}
else
       {k=0;
       for(j=1;j<=e[i];j++)
       if(p[d[i][j]]==2)
             {p[d[i][j]]=1;
             if(d[i][j]>n)
                     p[d[i][j]-n]=0;
             else
                     p[d[i][j]+n]=0;}
       else
             k++;
       if(k==e[i])
             (*val)=p[d[i][k]];
       else
             (*val)=1;}}
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;
       c[j]=v[j]=0;}
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];}
nr=ind=ss=ok=0;
for(i=1;i<=2*n;i++)
if(!c[i])
      tarjan(i,&nr,&ind,d,e);
for(i=nr;i>=1;i--)
if(!vazut[i])
      {ts(d,i,&val);
      val=0;}
for(i=1;i<=m;i++)
      {if(a[i]<0)
             a[i]=n-a[i];
      if(b[i]<0)
             b[i]=n-b[i];
      if(!p[a[i]]&&!p[b[i]])
             ok=1;}
if(ok==0)
      {for(i=1;i<=n;i++)
      if(p[i]==2)
             printf("0 ");
      else
             printf("%d ",p[i]);}
else
      printf("-1");
fclose(stdin);
fclose(stdout);
return 0;}