Pagini recente » Cod sursa (job #3291748) | Cod sursa (job #3288321) | Istoria paginii runda/jc2020-runda1 | Rating BLue FirE (frozen62ice) | Cod sursa (job #383816)
Cod sursa(job #383816)
#include <stdio.h>
#include <vector>
#include <bitset>
#include <map>
#include <queue>
using namespace std;
#define val(x) (x < 0) ? (-x + N) : x
#define forI(it,v) for (vector <int> :: iterator it = v.begin(); it != v.end(); ++ it)
#define maxN 200100
bitset <maxN> viz;
vector <int> G[maxN], V[maxN], CC[maxN], VV[maxN];
int N, M, Nr, Nr2, t[maxN], C[maxN], Grad[maxN], now[maxN], Sol[maxN];
map < int, int > Map[maxN];
queue <int> q;
void df1 (int x) {
viz[x] = 1;
forI(it, G[x])
if (!viz[*it])
df1(*it);
t[ ++ Nr] = x;
}
void df2 (int x) {
viz[x] = 1;
forI(it, V[x])
if (!viz[*it])
df2(*it);
C[x] = Nr2;
CC[Nr2].push_back(x);
}
void tsort () {
int i;
for (i = 1; i <= Nr2; ++ i)
if (!Grad[i])
q.push(i);
for (i = 1; i <= N; ++ i) {
now[i] = q.front(); q.pop();
forI(it, VV[now[i]]) {
-- Grad[*it];
if (!Grad[*it])
q.push(*it);
}
}
for (i = Nr2, viz.reset(); i; -- i) {
// printf("%d ", now[i]);
if (viz[now[i]]) continue;
viz[now[i]] = 1;
forI(it, VV[now[i]]) {
Sol[*it <= N ? *it : *it - N] = (*it <= N);
viz[C[*it]] = 1;
}
}
// puts("");
for (i = 1; i <= N; ++ i)
printf("%d ", Sol[i]);
}
int main () {
int i, a, b;
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);
G[val(-a)].push_back(val(b));
G[val(-b)].push_back(val(a));
V[val(b)].push_back(val(-a));
V[val(a)].push_back(val(-b));
}
for (i = 1; i <= 2 * N; ++ i)
if (!viz[i])
df1(i);
for (viz.reset(); Nr ; Nr --)
if (!viz[t[Nr]]) {
++ Nr2;
df2(t[Nr]);
}
for (i = 1; i <= N; ++ i)
if (C[i] == C[i + N]) {
printf("-1\n");
return 0;
}
for (i = 1; i <= Nr2; ++ i) {
forI(it, CC[i]) {
forI(it2, G[*it])
if (!Map[i][C[*it2]] && C[*it2] != i) {
Map[i][C[*it2]] = 1;
VV[i].push_back(C[*it2]);
++ Grad[C[*it2]];
}
}
}
tsort();
}