Cod sursa(job #2297201)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 5 decembrie 2018 15:58:57
Problema 2SAT Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("2sat.in");
ofstream fout("2sat.out");
const int lim = 2e5;
vector <int> ad[lim + 1], adt[lim + 1], srt;
vector <vector<int>> ctc;
int comp[lim + 1];
bool viz[lim + 1];

inline int getit(int x){
  return 2 * abs(x) - (x < 0);
}

void dfsi(int nod, int nr){
  viz[nod] = true;
  comp[nod] = nr;
  for(auto fiu : adt[nod])
    if(!viz[fiu])
      dfsi(fiu, nr);
}

void dfs(int nod){
  viz[nod] = true;
  srt.push_back(nod);
  for(auto fiu : ad[nod])
    if(!viz[fiu])
      dfs(fiu);
}

int main()
{
  int n, m, x, y, ncomp = 0;
  fin >> n >> m;
  for(int i = 0; i < m; i++){
    fin >> x >> y;
    ad[getit(-x)].push_back(getit(y));
    ad[getit(-y)].push_back(getit(x));
    adt[getit(x)].push_back(getit(-y));
    adt[getit(y)].push_back(getit(-x));
  }
  for(int i = 1; i <= 2 * n; i++)
    if(!viz[i])
      dfs(i);
  reverse(srt.begin(), srt.end());
  memset(viz, 0, lim + 1);
  for(auto e : srt)
    if(!viz[e])
      dfsi(e, ncomp++);
  for(int i = 1; i <= n; i++)
    if(comp[2 * i] == comp[2 * i - 1]){
      fout << "-1";
      return 0;
    }
  for(int i = 1; i <= n; i++)
    fout << (comp[2 * i] > comp[2 * i - 1]) << ' ';
  return 0;
}