Pagini recente » Cod sursa (job #358492) | Cod sursa (job #1987432) | Cod sursa (job #859032) | Cod sursa (job #847590) | Cod sursa (job #383823)
Cod sursa(job #383823)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#define maxn 100100
#define ff first
#define ss second
using namespace std;
int n, m, i, j, n1, n2;
vector <int> g[2 * maxn], gt[2 * maxn];
pair <int, int> t[maxn];
int stack[maxn], viz[maxn], ctc[maxn], mark[maxn], rez[maxn], afis[maxn];
int vf, sol, a, b, nr;
vector <int> comp[maxn];
inline int negat(int r) {
r = r + n;
if (r > 2 * n)
r -= 2 * n;
return r;
}
void df1(int nod, int nr) {
int i;
if (viz[nod])
return;
viz[nod] = nr;
for (i = 0; i < g[nod].size(); i++)
df1(g[nod][i], nr);
stack[++vf] = nod;
}
void df2(int nod, int nr) {
int i;
if (ctc[nod])
return;
comp[nr].push_back(nod);
ctc[nod] = nr;
for (i = 0; i < gt[nod].size(); i++)
df2(gt[nod][i], nr);
}
int main() {
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
scanf("%d%d", &n, &m);
for (i = 1; i <= m; i++) {
scanf("%d%d", &a, &b);
t[i] = make_pair(a, b);
n1 = a;
if (a < 0)
n1 = -a + n;
n2 = b;
if (b < 0)
n2 = -b + n;
gt[n1].push_back(negat(n2));
g[negat(n2)].push_back(n1);
gt[n2].push_back(negat(n1));
g[negat(n1)].push_back(n2);
}
for (i = 1; i <= 2 * n; i++)
if (!viz[i])
df1(i, ++nr);
nr = 0;
for (i = vf; i >= 1; i--)
if (!ctc[stack[i]])
df2(stack[i], ++sol);
for (i = 1; i <= n; i++)
if (ctc[i] == ctc[i + n]) {
printf("-1\n");
return 0;
}
// return 0;
memset(viz, 0, sizeof(viz));
for (i = 2 * n; i >= 1; i--) {
if (!viz[ctc[i]]) {
rez[ctc[i]] = 1;
rez[ctc[i + n]] = 0;
}
}
// return 0;
for (i = 1; i <= sol; i++) {
for (j = 0; j < comp[i].size(); j++)
afis[comp[i][j]] = rez[i];
}
for (i = 1; i <= n; i++)
printf("%d ", rez[i]);
return 0;
}