Pagini recente » Cod sursa (job #2899862) | Cod sursa (job #1836829) | Cod sursa (job #963843) | Cod sursa (job #2841978) | Cod sursa (job #1471612)
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
int N,M,x,y,s[210000],curr,c[210000],comp,sol[210000];
vector<int> m[210000],n[210000],v[210000];
bool viz[210000],ok=1,vz[210000];
void dfs(int x) {
viz[x] = 1;
for(int i=0;i<m[x].size();++i) {
if(!viz[m[x][i]]) {
dfs(m[x][i]);
}
}
s[++curr] = x;
}
void dfs2(int x) {
viz[x] = 0;
c[x] = comp;
v[comp].push_back(x);
for(int i=0;i<n[x].size();++i) {
if(viz[n[x][i]]) {
dfs2(n[x][i]);
}
}
}
inline int ng(int x) {
if(x%2==0) return x+1;
else return x-1;
}
void f(int x, int val) {
vz[x] = 1;
for(int i=0;i<v[x].size();++i) {
int y = v[x][i];
if(sol[y] && sol[y]!=val) {
ok = 0;
}
sol[y] = val;
}
for(int i=0;i<v[x].size();++i) {
int y = ng(v[x][i]);
if(sol[y] && sol[y]!=3-val) {
ok = 0;
}
if(!sol[y]) {
f(c[y],3-val);
}
}
}
int main() {
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
//freopen("input.in","r",stdin);
scanf("%d%d",&N,&M);
for(int i=0;i<M;++i) {
scanf("%d%d",&x,&y);
int a = 0, b = 0;
if(x < 0) {
a = 1;
x = -x;
}
if(y < 0) {
b = 1;
y = -y;
}
m[2*x+(1-a)].push_back(2*y+b);
m[2*y+(1-b)].push_back(2*x+a);
n[2*y+b].push_back(2*x+(1-a));
n[2*x+a].push_back(2*y+(1-b));
}
for(int i=2;i<=2*N+1;++i) {
if(!viz[i]) {
dfs(i);
}
}
for(int i=curr;i>=1;--i) {
if(viz[s[i]]) {
++comp;
dfs2(s[i]);
}
}
for(int i=1;i<=comp;++i) {
if(!vz[i]) {
f(i,1); //make neg
}
}
if(!ok) {
printf("-1");
} else {
for(int i=2;i<=2*N;i+=2) {
printf("%d ",sol[i]-1);
}
}
return 0;
}