Pagini recente » Cod sursa (job #1031681) | Cod sursa (job #842657) | Cod sursa (job #1592270) | Cod sursa (job #1270278) | Cod sursa (job #1542415)
#include <iostream>
#include<vector>
#include<stdio.h>
using namespace std;
#define nmax 2*100005
vector <int> ma[nmax], mat[nmax], comp[nmax];
vector <int> ::iterator it;
int i, n, m, a, nrcomp, b, viz[nmax],rez[nmax], v[nmax], nt, vcomp[nmax], v2[nmax], poz, ok, val[nmax];
int non(int x){
if(x<=n)
return x+n;
return x-n;
}
void citire(){
scanf("%d %d",&n,&m);
for (int i=1;i<=m;i++){
scanf("%d %d",&a,&b);
if (a<0)
a=n-a;
if (b<0)
b=n-b;
ma[non(a)].push_back(b);
ma[non(b)].push_back(a);
mat[b].push_back(non(a));
mat[a].push_back(non(b));
}
}
void dfs1(int x){
vector <int> ::iterator it;
viz[x]=1;
for (it=ma[x].begin();it!=ma[x].end();it++)
if (!viz[*it])
dfs1(*it);
v[++nt]=x;
}
void dfs2(int x){
vector<int> ::iterator it;
viz[x]=2;
rez[non(x)]=1;
for (it=mat[x].begin();it!=mat[x].end();it++)
if (viz[*it]<2)
dfs2(*it);
}
int main(){
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
citire();
for (int i=1;i<=2*n;i++)
if (!viz[i])
dfs1(i);
for (int i=nt;i>=1;i--)
if ((viz[v[i]]!=2)&&(viz[non(v[i])]!=2)){
dfs2(v[i]);
}
ok=1;
for (int i=1;i<=n;i++)
if ((rez[i]==rez[non(i)]) &&(rez[i]==1))
{
ok=0;
break;
}
if (!ok){
printf("-1\n");
}
else{
for (int i=1;i<=n;i++)
printf("%d ",rez[i]);
}
return 0;
}