Cod sursa(job #1387792)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 14 martie 2015 17:59:58
Problema 2SAT Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
 vector <int> v[200005],vt[200005],gc[200005];

 int n,m,k,nr,add=100002,c[200005],use[200005],a[200005],was[200005],sol[200005];

 int neg(int x)
 { if (x>add) return x-add;
    else return x+add;
 }

 void DFS1(int x)
 { int i;
     use[x]=1;
    for(i=0;i<v[x].size();i++)
      if (!use[v[x][i]]) DFS1(v[x][i]);
   k++; a[k]=x;
 }

 void DFS2(int x)
 { int i;
     c[x]=nr;
     gc[nr].push_back(x);
   for(i=0;i<vt[x].size();i++)
      if (!c[vt[x][i]]) DFS2(vt[x][i]);
 }
int main()
{ int i,j,x,y,x2,y2;
    f>>n>>m;

    for(i=1;i<=m;i++)
    { f>>x>>y;
        if (x<0) x=-x+add;
        if (y<0) y=-y+add;

      v[neg(x)].push_back(y);
      vt[y].push_back(neg(x));
      v[neg(y)].push_back(x);
      vt[x].push_back(neg(y));
    }

    for(i=1;i<=n+add;i++)
     if (!use[i]) DFS1(i);

    for(i=k;i>=1;i--)
     if (!c[a[i]]) { nr++; DFS2(a[i]); }

    for(i=nr;i>=1;i--)
    { if (was[i]) continue;

       for(j=0;j<gc[i].size();j++)
       {
         sol[gc[i][j]]=1;
          was[c[neg(gc[i][j])]]=1;
       }
    }

    for(i=1;i<=n;i++)
     g<<sol[i]<<" ";
  return 0;
}