Pagini recente » Cod sursa (job #29797) | Cod sursa (job #1801057) | Cod sursa (job #2938719) | Cod sursa (job #2082781) | Cod sursa (job #2416338)
#include <bits/stdc++.h>
#define maxN 200002
using namespace std;
FILE *fin = freopen("2sat.in", "r", stdin);
FILE *fout = freopen("2sat.out", "w", stdout);
int n, m;
vector < int > V[2][maxN];
int ts[maxN];
bool vis[maxN];
bool ans[maxN];
void NoSol()
{
printf("-1");
exit(0);
}
int Not(int u)
{
if (u < n) return u + n;
return u - n;
}
void dfs(int ty, int u)
{
vis[u] = !ty;
if (ty && ans[u])
NoSol();
if (ty)
{
ans[u] = false;
ans[Not(u)] = true;
}
for (int v : V[ty][u])
if (vis[v] == ty)
dfs(ty, v);
if (!ty)
ts[++ ts[0]] = u;
}
void AddEdge(int u, int v)
{
V[0][Not(u)].push_back(v);
V[1][v].push_back(Not(u));
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < m; ++ i)
{
int u, v;
scanf("%d%d", &u, &v);
if (u < 0) u = Not(-u - 1);
else -- u;
if (v < 0) v = Not(-v - 1);
else -- v;
AddEdge(u, v);
AddEdge(v, u);
}
for (int i = 0; i < 2 * n; ++ i) if (!vis[i]) dfs(0, i);
for (int i = 2 * n; i > 0; -- i) if (vis[ts[i]] && vis[Not(ts[i])])
dfs(1, ts[i]);
for (int i = 0; i < n; ++ i) printf("%d ", ans[i]);
return 0;
}