Cod sursa(job #606633)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 6 august 2011 12:14:58
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream.h>
#include<vector.h>
#define N 200001
long n,m,i,a[N],b[N],j,k,p[N],w[N],c[N],nr;
vector<long> f[N],g[N];
void ds(int x)
{c[x]=1;
for(i=0;i<f[x].size();i++)
if(!c[f[x][i]])
       ds(f[x][i]);
w[++nr]=x;}

void dt(int x)
{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<g[x].size();i++)
if(c[g[x][i]])
       dt(g[x][i]);}

int main()
{ifstream f1("2sat.in");
ofstream f2("2sat.out");
f1>>n>>m;
for(i=1;i<=m;i++)
       {f1>>a[i]>>b[i];
       if(a[i]<0)
              a[i]=n-a[i];
       if(b[i]<0)
              b[i]=n-b[i];
       if(a[i]>n)
              f[a[i]-n].push_back(b[i]),g[b[i]].push_back(a[i]-n);
       else
              f[a[i]+n].push_back(b[i]),g[b[i]].push_back(a[i]+n);
       if(b[i]>n)
              f[b[i]-n].push_back(a[i]),g[a[i]].push_back(b[i]-n);
       else
              f[b[i]+n].push_back(a[i]),g[a[i]].push_back(b[i]+n);}
for(j=1;j<=2*n;j++)
       p[j]=2;
for(i=1;i<=2*n;i++)
if(!c[i])
       ds(i);
for(i=nr;i>0;i--)
if(c[w[i]])
       dt(w[i]);
for(j=1;j<=m;j++)
if(!p[a[j]]&&!p[b[j]])
       {f2<<"-1";
       return 0;}
for(i=1;i<=n;i++)
       f2<<p[i]<<" ";
return 0;}