Pagini recente » Cod sursa (job #2875209) | Cod sursa (job #734357) | Cod sursa (job #2330504) | Monitorul de evaluare | Cod sursa (job #2406617)
#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;
}