Cod sursa(job #606604)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 5 august 2011 13:55:46
Problema 2SAT Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<stdio.h>
#include<stdlib.h>
#define N 200001
long n,m,i,a[N],b[N],u[N],v[N],*f[N],*g[N],j,k,w[N],nr=0;
int p[N],c[N];

void dfs(int x)
{int i;
c[x]=1;
for(i=0;i<u[x];i++)
if(!c[f[x][i]])
       dfs(f[x][i]);
w[++nr]=x;}

void dfst(int x)
{int i;
c[x]=0;
if(p[x]==2)
       {p[x]=0;
       if(x>n)
               p[x-n]=1;
       else
               p[x+n]=1;}
for(i=0;i<v[x];i++)
if(c[g[x][i]])
       dfst(g[x][i]);}

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)
              u[n-a[i]]++,v[0-a[i]]++;
       else
              u[a[i]]++,v[n+a[i]]++;
       if(b[i]<0)
              u[n-b[i]]++,v[0-b[i]]++;
       else
              u[b[i]]++,v[n+b[i]]++;}
for(j=1;j<=2*n;j++)
       {f[j]=(long*)malloc(u[j]*sizeof(long));
       g[j]=(long*)malloc(v[j]*sizeof(long));
       p[j]=2,u[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)
              f[a[k]-n][u[a[k]-n]++]=b[k],g[b[k]][v[b[k]]++]=a[k]-n;
       else
              f[n+a[k]][u[a[k]+n]++]=b[k],g[b[k]][v[b[k]]++]=a[k]+n;
       if(b[k]>n)
              f[b[k]-n][u[b[k]-n]++]=a[k],g[a[k]][v[a[k]]++]=b[k]-n;
       else
              f[n+b[k]][u[b[k]+n]++]=a[k],g[a[k]][v[a[k]]++]=b[k]+n;}
for(i=1;i<=2*n;i++)
if(!c[i])
       dfs(i);
for(i=nr;i>0;i--)
if(c[w[i]])
       dfst(w[i]);
for(i=1;i<=n;i++)
       printf("%d ",p[i]);
return 0;}