Pagini recente » Cod sursa (job #2514620) | Cod sursa (job #1895746) | Cod sursa (job #1063047) | Cod sursa (job #914201) | Cod sursa (job #383829)
Cod sursa(job #383829)
#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
#define forit(it, v) for(__typeof(v.begin()) it = v.begin(); it != v.end(); ++it)
const int MAX_N = 100010;
int n, m, z, sol;
int f[MAX_N * 2], q[2 * MAX_N], d[MAX_N * 2];
vector <int> v[MAX_N * 2], s[MAX_N * 2], vt[MAX_N * 2];
inline int inv(int nod)
{
if (nod > n)
return nod - n;
return nod + n;
}
void df(int nod)
{
if (f[nod])
return;
f[nod] = 1;
forit(it, v[nod])
df(*it);
q[++z] = nod;
}
void df2(int nod)
{
if (f[nod] == 2)
return;
f[nod] = 2;
s[sol].pb(nod);
forit(it, vt[nod])
df2(*it);
}
int main()
{
int i;
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i <= m; ++i)
{
int r1, r2, n1, n2;
scanf("%d %d", &r1, &r2);
n1 = r1;
if (r1 < 0)
n1 = n + (-r1);
n2 = r2;
if (r2 < 0)
n2 = n + (-r2);
v[inv(n1)].pb(n2);
v[inv(n2)].pb(n1);
vt[n2].pb(inv(n1));
vt[n1].pb(inv(n2));
}
for (i = 1; i <= 2 * n; ++i)
if (!f[i])
df(i);
for (i = 2 * n; i; --i)
if (f[q[i]] != 2)
{
++sol;
df2(q[i]);
}
for (i = 1; i <= sol; ++i)
forit(it, s[i])
d[*it] = i;
for (i = 1; i <= n; ++i)
{
f[i] = f[i + n] = -1;
if (d[i] == d[i + n])
{
printf("-1\n");
return 0;
}
}
for (i = 2 * n; i; --i)
{
if (f[i] >= 0)
continue;
forit(it, s[d[i]])
f[*it] = 1;
forit(it, s[d[inv(i)]])
f[*it] = 0;
}
for (i = 1; i <= n; ++i)
printf("%d ", f[i]);
}