Cod sursa(job #2458950)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 21 septembrie 2019 22:59:29
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
#include <stack>

using namespace std;

ifstream fin("2sat.in");
ofstream fout("2sat.out");

int n,m;
vector<int> v[200005];

bool ins[200005];
bool vis[200005];
int disc[200005];
int low [200005];
int countt;
stack<int> s;
vector<int> comp[200005];
int compcount;

int indComp[200005];
int op[200005];
bool val[200005];
bool visC[200005];
bool exists=true;

void specDFS(int nod)
{
  s.push(nod);
  countt++;
  disc[nod]=low[nod]=countt;
  vis[nod]=true;
  ins[nod]=true;
  for(int i=0;i<v[nod].size();i++)
  {
    int currentNod=v[nod][i];
    if(!vis[currentNod])
    {
      specDFS(currentNod);
      low[nod]=std::min(low[nod],low[currentNod]);
    }
    else if(vis[currentNod] && ins[currentNod])
      low[nod]=std::min(low[nod],disc[currentNod]);
  }
  if(low[nod]==disc[nod])
  {
  //  cout<<nod-n<<"\n";
    int tp= s.top();
    do
    {
      tp=s.top();
      comp[compcount].push_back(tp);
      ins[tp]=false;
      indComp[tp]=compcount;
      int optp=-(tp-n)+n;
      if(indComp[optp]!=-1 &&indComp[optp]==indComp[tp])
      {
        exists=false;
        return;
      }
      else if(indComp[optp]!=-1)
      {
        op[optp]=indComp[tp];
        op[tp]=indComp[optp];
      }
      s.pop();
    }
    while(tp!=nod);
    compcount++;
  }
}

int main()
{
  fin>>n>>m;
  for(int i=0;i<=2*n;i++)
  {
    low[i]=2*n+1;
    indComp[i]=-1;
  }
  for(int i=0;i<m;i++)
  {
    int j,k;
    fin>>j>>k;
    v[-j+n].push_back(k+n);
    v[-k+n].push_back(j+n);
  }
  for(int i=0;i<=2*n;i++)
  {
    if(i==n) continue;
    if(vis[i]) continue;
    specDFS(i);
  }
  if(!exists)
  {
    fout<<"-1";
    return 0;
  }
  for(int i=compcount-1;i>=0;i--)
  {
    int first=comp[i][0];
    if(visC[indComp[first]])continue;
    for(unsigned int j=0;j<comp[i].size();j++)
    {
      int elem= comp[i][j];
      if(elem<n)
        val[-(elem-n)]=1;
      else
        val[elem-n]=0;
    }
    visC[indComp[first]]=true;
    visC[op[first]]=true;
  }
  for(int i=1;i<=n;i++)
    fout<<(int)val[i]<<" ";
}