Pagini recente » Cod sursa (job #384096) | Cod sursa (job #1212980) | Cod sursa (job #3223514) | Cod sursa (job #1567121) | Cod sursa (job #1550592)
#include <stdio.h>
#include <vector>
#include <deque>
#define MAX 200005
#define neg(x) (((x) <= (n)) ? (x + n) : (x - n))
#define min(a, b) (((a) < (b)) ? (a) : (b))
using namespace std;
int n, m, a, b, val[MAX], viz[MAX];
int index[MAX], lowlink[MAX], ind;
vector<int> l[MAX], c, s;
deque< vector<int> > C;
bool onStack[MAX];
void ctc(int v){
s.push_back(v);
onStack[v] = 1;
index[v] = lowlink[v] = ind++;
for(int i = 0; i < l[v].size(); i++)
if(!index[l[v][i]]){
ctc(l[v][i]);
lowlink[v] = min(lowlink[v], lowlink[l[v][i]]);
}
else
lowlink[v] = min(lowlink[v], index[l[v][i]]);
if(lowlink[v] == index[v]){
int x = 0;
while(x != v){
x = s.back();
s.pop_back();
onStack[x] = 0;
c.push_back(x);
}
C.push_back(c);
c.clear();
}
}
int main(){
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= 2 * n; i++)
val[i] = -1;
for(int i = 0; i < m; i++){
scanf("%d%d", &a, &b);
if(a < 0)
a = n - a;
if(b < 0)
b = n - b;
l[neg(a)].push_back(b);
l[neg(b)].push_back(a);
}
for(int i = 1; i <= 2 * n; i++)
if(!index[i])
ctc(i);
for(int i = 0; i < C.size(); i++)
for(int j = 0; j < C[i].size(); j++)
if(viz[C[i][j]] == i && val[neg(C[i][j])] == 1){
printf("-1\n");
return 0;
}
else if(val[neg(C[i][j])] == -1){
viz[C[i][j]] = i;
val[C[i][j]] = 1;
val[neg(C[i][j])] = 0;
}
for(int i = 1; i <= n; i++)
printf("%d ", val[i]);
return 0;
}