Cod sursa(job #2218283)

Utilizator cella.florescuCella Florescu cella.florescu Data 4 iulie 2018 06:39:20
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5;

vector < int > g[2 * MAXN + 1], gt[2 * MAXN + 1], ord;
int seen[2 * MAXN + 1], val[2 * MAXN + 1];
int n, nope;

inline int non(int node) {
  if (node <= n)
    return node + n;
  return node - n;
}

void norm_dfs(int node) {
  seen[node] = 1;
  for (auto it : g[node])
    if (seen[it] == 0)
      norm_dfs(it);
  ord.push_back(node);
}

void rev_dfs(int node) {
  if (val[node])
    nope = 1;
  val[non(node)] = 1;
  seen[node] = 0;
  for (auto it : gt[node])
    if (seen[it])
      rev_dfs(it);
}

int main()
{
    int m;
    ifstream fin("2sat.in");
    fin >> n >> m;
    for (int i = 0; i < m; ++i) {
      int x, y;
      fin >> x >> y;
      if (x < 0)
        x = -x + n;
      if (y < 0)
        y = -y + n;
      g[non(x)].push_back(y);
      g[non(y)].push_back(x);
      gt[x].push_back(non(y));
      gt[y].push_back(non(x));
    }
    fin.close();
    for (int i = 1; i <= 2 * n; ++i)
      if (seen[i] == 0)
        norm_dfs(i);
    while (ord.empty() == false) {
      if (seen[ord.back()] && seen[non(ord.back())])
        rev_dfs(ord.back());
      ord.pop_back();
    }
    ofstream fout("2sat.out");
    if (nope)
      fout << "-1\n";
    else {
      for (int i = 1; i <= n; ++i)
        fout << val[i] << " ";
      fout << '\n';
    }
    fout.close();
    return 0;
}