Pagini recente » Cod sursa (job #663129) | Cod sursa (job #284161) | Cod sursa (job #462657) | Cod sursa (job #2895783) | Cod sursa (job #1078538)
#include <stdio.h>
#include <vector>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define N 100000
using namespace std;
int L[2*N],l;
bool COL[2*N+1],cool=true;
bool V[2*N+1];
bool* col=COL+N,*v=V+N;
vector<int>oo[2*N+1],OO[2*N+1];
vector<int>*o=oo+N,*O=OO+N;
void dfs1(int i){
col[i]=true;
int s=o[i].size();
fr(j,0,s) if(!col[o[i][j]]) dfs1(o[i][j]);
L[--l]=i;
}
void dfs2(int i){
col[i]=false;
v[-i]=true;
int s=O[i].size();
fr(j,0,s) if(col[O[i][j]]) dfs2(O[i][j]);
}
int main(){
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
int n,m,x,y;
scanf("%i%i",&n,&m);
int n1=n+1;
fr(i,0,m){
scanf("%i%i",&x,&y);
o[-x].push_back(y);
o[-y].push_back(x);
O[x].push_back(-y);
O[y].push_back(-x);
}
l=n<<1;
fr(i,-n,n1){
if(!i)continue;
if(!col[i]) dfs1(i);
}
fr(i,0,2*n){
if(v[-L[i]]||v[L[i]]) continue;
if(col[L[i]]) dfs2(L[i]);
}
fr(i,1,n1) if(v[i]&&v[-i]){cool=false;break;}
if(cool) fr(i,0,n)printf("%i ",v[i+1]);
else printf("-1");
return 0;
}