Cod sursa(job #1690103)

Utilizator RadduFMI Dinu Radu Raddu Data 14 aprilie 2016 19:37:55
Problema 2SAT Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
queue <int> q;
vector <int> v[200005],vt[200005],c[200005],vc[200005];
int n,m,k,nrc,use[200005],comp[200005],a[200005],edge[200005],solved[200005],val[200005],gr[200005];

int Neg(int x)
{ if (x>n) return x-n;
  return x+n;
}

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

  k++; a[k]=x;
}

void DFSC(int x)
{ int i;
  use[x]=1;
  comp[x]=nrc; c[nrc].push_back(x);

  for(i=0;i<vt[x].size();i++)
   if (!use[vt[x][i]]) DFSC(vt[x][i]);
}

void SortTop()
{ int i,nod;
  while(!q.empty())
  { nod=q.front(); q.pop();

     if (!solved[nod])
     {   val[nod]=0;
       val[comp[Neg(c[nod][0])]]=1;
       solved[nod]=1;
       solved[comp[Neg(c[nod][0])]]=1;
     }

      for(i=0;i<vc[nod].size();i++)
      {gr[vc[nod][i]]--;
       if (!gr[vc[nod][i]]) q.push(vc[nod][i]);
      }
  }
}
int main()
{ int i,j,t,nod,x,y,act;
    f>>n>>m;

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

     v[Neg(x)].push_back(y);
     v[Neg(y)].push_back(x);


     vt[y].push_back(Neg(x));
     vt[x].push_back(Neg(y));
    }

    memset(use,0,sizeof(use));

    for(i=1;i<=2*n;i++)
      if (!use[i]) DFS(i);


    memset(use,0,sizeof(use));

    for(i=k;i>=1;i--)
     if (!use[a[i]]) { nrc++; DFSC(a[i]);  }



   memset(use,0,sizeof(use));
    for(i=1;i<=nrc;i++)
    {
      act=0;
       for(j=0;j<c[i].size();j++)
       { nod=c[i][j];

          for(t=0;t<v[nod].size();t++)
           if (comp[v[nod][t]]!=comp[nod] && !use[comp[v[nod][t]]])
           { vc[comp[nod]].push_back(comp[v[nod][t]]);
             use[comp[v[nod][t]]]=1;
             act++; edge[act]=comp[v[nod][t]];
           }
       }

     for(j=1;j<=act;j++)
      use[edge[j]]=0;
    }

 for(i=1;i<=nrc;i++)
 { for(j=0;j<vc[i].size();j++)
    gr[vc[i][j]]++;
 }

 for(i=1;i<=nrc;i++)
  if (!gr[i]) q.push(i);

 SortTop();

 for(i=1;i<=n;i++)
  g<<val[comp[i]]<<" ";


    return 0;
}