Pagini recente » Cod sursa (job #1734387) | Cod sursa (job #1671447) | Cod sursa (job #675636) | Cod sursa (job #718832) | Cod sursa (job #2910656)
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cassert>
bool home = 1;
using namespace std;
struct SAT2 {
int n;
vector<bool> vis;
vector<vector<int>> g;
vector<vector<int>> ig;
vector<int> ord;
vector<int> comp;
int cur;
SAT2(int n) : n(n), comp(2 * n + 1, 0), vis(2 * n + 1, 0), g(2 * n + 1), ig(2 * n + 1), cur(0) {
}
void dfs(int a) {
if (vis[a]) return;
vis[a] = 1;
for (auto& b : g[a]) {
dfs(b);
}
ord.push_back(a);
}
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;
}
void solve() {
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]));
}
}
};
signed main() {
freopen ("2sat.in", "r", stdin);
freopen ("2sat.out", "w", stdout);
int n, m;
scanf("%d %d", &n, &m);
SAT2 sat(n);
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);
sat.addEdge(sat.inv(a), b);
sat.addEdge(sat.inv(b), a);
}
sat.solve();
}