Cod sursa(job #2899876)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 9 mai 2022 14:45:01
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
/// always:
#include <cstdio>
#include <string>

/// optional:
#include <cassert>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>

bool home = 1;
using namespace std;

const string TASKNAME="2sat";
const int N=200000+7;
int n;
int m;
bool vis[N];
vector<int> g[N];
vector<int> ig[N];
vector<int> ord;

void dfs(int a) {
  if (vis[a]) return;
  vis[a]=1;
  for (auto &b:g[a]) {
    dfs(b);
  }
  ord.push_back(a);
}

int comp[N],cur;

void invdfs(int a) {
  if(vis[a]) return;
  comp[a]=cur;
  vis[a]=1;
  for (auto &b:ig[a]) {
    invdfs(b);
  }
}

void addEdge(int a, int b) {
  g[a].push_back(b);
  ig[b].push_back(a);
}

int inv(int x) {
  if (x<=n) return x+n;
  return x-n;
}

signed main() {
#ifdef INFOARENA
  home = 0;
#endif

  if(!home) {
    freopen((TASKNAME + ".in").c_str(), "r", stdin);
    freopen((TASKNAME + ".out").c_str(), "w", stdout);
  }else{
    freopen ("I_am_iron_man", "r", stdin);
  }

  scanf("%d%d",&n,&m);
  for (int i=1;i<=m;i++) {
    int a,b;
    scanf("%d%d",&a,&b);
    if (a<0) a=n-a;
    if (b<0) b=n-b;

    assert(1<=a&&a<=2*n);
    assert(1<=b&&b<=2*n);

    addEdge(a,inv(b));
    addEdge(inv(a),b);
  }
  for (int i=1;i<=2*n;i++) {
    dfs(i);
  }
  reverse(ord.begin(),ord.end());
  for (int i=1;i<=2*n;i++) {
    vis[i]=0;
  }
  for (auto &i:ord) {
    if(vis[i]) continue;
    cur++;
    invdfs(i);
  }
  for (int i=1;i<=n;i++) {
    if(comp[i]==comp[i+n]){
      printf("-1\n");
      exit(0);
    }
  }
  for (int i=1;i<=n;i++) {
    printf("%d ", (comp[i]<comp[i+n]));
  }

}