Pagini recente » Cod sursa (job #2428831) | Cod sursa (job #2291085) | Cod sursa (job #3191345) | Cod sursa (job #2574004) | Cod sursa (job #1542379)
#include <iostream>
#include <cstdio>
#include <vector>
#define N 200005
#define D 100000
using namespace std;
vector <int> a[N],a2[N],L,cc;
int v[N],c[N];
int n,m;
int t;
void R()
{
freopen("2sat.in","r",stdin);
scanf("%d %d",&n,&m);
int x,y,i,nx,ny;
for(i=1; i<=m; i++)
{
scanf("%d %d",&x,&y);
nx=x*-1;
ny=y*-1;
x+=D;
y+=D;
nx+=D;
ny+=D;
a[nx].push_back(y);
a[ny].push_back(x);
a2[y].push_back(nx);
a2[x].push_back(ny);
}
}
bool nusat=0;
void DFS(int k)
{
v[k]=1;
for(int i=0; i<a[k].size(); ++i)
if(!v[a[k][i]])
DFS(a[k][i]);
L.push_back(k);
}
void DFS2(int k,int t)
{
c[k]=t;
cc.push_back(k);
if(k<D && c[(D-k)+D]==t)
nusat=1;
if(k>D && c[D-(k-D)]==t ) nusat=1;
for(int i=0; i<a2[k].size(); ++i)
if(!c[a2[k][i]])
DFS2(a2[k][i],t);
}
int sol[N];
void Solve()
{
int i,nod;
for(i=D-n-1; i<=D+n; i++) sol[i]=-1;
for(i=0; i<cc.size(); i++ )
{
if(cc[i]<D && sol[(D-cc[i])+D]>-1)
sol[cc[i]]=1-sol[(D-cc[i])+D];
else if(cc[i]>D && sol[D-(cc[i]-D)]>-1)
sol[cc[i]]=1-sol[D-(cc[i]-D)];
// else if (L[i]<D) sol[L[i]+]=1;
else sol[cc[i]]=0;
}
}
int main()
{
R();
int i;
for(i=D-n-1; i<=D+n; i++)
if(!v[i] && i!=D)
DFS(i);
t=1;
for(i=L.size()-1; i>0; i--)
if(!c[L[i]])
{
DFS2(L[i],t);
t++;
}
freopen("2sat.out","w",stdout);
if(nusat)
{
printf("-1\n");
return 0;
}
Solve();
//freopen("2sat.out","w",stdout);
for(i=D+1; i<=D+n; i++)
printf("%d ",sol[i]);
//cout<<sol[i]<<"\n";
return 0;
}