Cod sursa(job #2406617)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 15 aprilie 2019 22:17:01
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 100000;
const int MAXM = 200000;

vector<int>G1[2 * MAXN + 5];
vector<int>G2[2 * MAXN + 5];

int n, m;

int transf(int x) {
  if (x < 0)
    x = -x;
  else
    x += n;
  return x;
}

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

int k;
int lista[2 * MAXN + 5];
int comp[2 * MAXN + 5];
bool viz[2 * MAXN + 5];
int ans[2 * MAXN + 5];
vector<int>sol[2 * MAXN + 5];

void dfs1(int node) {
  viz[node] = 1;
  for (auto it:G1[node])
    if (!viz[it])
      dfs1(it);
  lista[++k] = node;
}

void dfs2(int node) {
  comp[node] = k;
  sol[k].push_back(node);
  viz[node] = 0;
  for (auto it:G2[node])
    if (viz[it])
      dfs2(it);
}

int main() {
  freopen("2sat.in", "r", stdin);
  freopen("2sat.out", "w", stdout);

  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    u = transf(u);
    v = transf(v);
    G1[neg(u)].push_back(v);
    G1[neg(v)].push_back(u);
    G2[v].push_back(neg(u));
    G2[u].push_back(neg(v));
  }

  for (int i = 1; i <= 2 * n; ++i)
    if (!viz[i])
      dfs1(i);

  k = 0;

  for (int i = 2 * n; i >= 1; --i)
    if (viz[lista[i]]) {
      k++;
      dfs2(lista[i]);
    }

  for (int i = 1; i <= n; ++i)
    if (comp[i] == comp[i + n]) {
      printf("-1\n");
      return 0;
    }

  for (int i = 1; i <= k; ++i)
    if (!ans[sol[i][0]]) {
      for (auto it:sol[i])
        ans[it] = 1;
      for (auto it:sol[comp[neg(sol[i][0])]])
        ans[it] = 2;
    }

  for (int i = n + 1; i <= 2 * n; ++i)
    printf("%d ", ans[i] - 1);

  return 0;
}