Cod sursa(job #2500178)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 27 noiembrie 2019 13:08:35
Problema 2SAT Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <vector>
#include <cmath>

const int MAXN = 100000;

using namespace std;

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

int n, m;

int id_[2 * MAXN + 2], lastId, low_[2 * MAXN + 2], st[MAXN + 1], vf, state_[2 * MAXN + 2];
bool visited_[2 * MAXN + 2], inStack_[2 * MAXN + 2], ok = true;
vector<int> graph_[2 * MAXN + 2];

int* id = id_ + MAXN;
int* low = low_ + MAXN;
int* state = state_ + MAXN;
bool* visited = visited_ + MAXN;
bool* inStack = inStack_ + MAXN;
vector<int>* graph = graph_ + MAXN;

void dfs(int node){

  visited[node] = true;
  id[node] = low[node] = ++lastId;

  st[++vf] = node;
  inStack[node] = true;

  for(auto it:graph[node]) {
    if(!visited[it]) {
      dfs(it);

      low[node] = min(low[node], low[it]);
    }
    else if(inStack[it]) {
      low[node] = min(low[node], low[it]);
    }
  }

  if(id[node] == low[node]) {
    int atr=0;

    for(int i=vf; i > 0 && st[i+1] != node && ok; i--)
      if(state[st[i]] != 0) {
        if(atr == 0)
          atr = state[st[i]];
        else if(atr != state[st[i]])
          ok = false;
      }
      else if(state[-st[i]] != 0) {
        if(atr == 0)
          atr = state[-st[i]];
        else if(atr != state[-st[i]])
          ok = false;
      }

    if(ok) {
      if(atr == 0)
        atr = 1;

      while(vf > 0 && st[vf+1] != node) {
        state[st[vf]] = atr;
        state[-st[vf]] = -atr;

        vf--;
      }
    }
  }
}

int main()
{
  fin>>n>>m;

  for(int i=1; i<=m; i++) {
    int x, y;

    fin>>x>>y;

    graph[-x].push_back(y);
    graph[-y].push_back(x);
  }

  for(int i=-n; i<=n && ok; i++)
    if(!visited[i]) {
      dfs(i);
    }

  if(ok) {
    for(int i=1; i<=n; i++) {
      fout<<(state[i] == 1)<<" ";
    }
  } else {
    fout<<"-1";
  }

  return 0;
}