Pagini recente » Cod sursa (job #1188989) | Cod sursa (job #2952491) | Cod sursa (job #1775364) | Cod sursa (job #2478979) | Cod sursa (job #2595183)
#include <bits/stdc++.h>
#define K100 100000
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
int n,m,p;
int vf[4*K100+1],urm[4*K100+1],last[2*K100+2],nr;
int vf2[4*K100+1],urm2[4*K100+1],last2[2*K100+2];
int vf3[2*K100+2],urm3[2*K100+2],last3[2*K100+2],nrc;
int ord[2*K100+2],t;
bitset <2*K100+2> viz;
map <int,int> comp;
int val[K100+1];
void adauga(int nod,int vec)
{
vf[++nr]=vec;
urm[nr]=last[nod];
last[nod]=nr;
swap(nod,vec);
vf2[nr]=vec;
urm2[nr]=last2[nod];
last2[nod]=nr;
}
void adaugaT(int nod,int nrc)
{
vf3[++nr]=nod;
urm3[nr]=last3[nrc];
last3[nrc]=nr;
}
void dfs(int nod)
{
viz[nod]=1;
for(int k=last[nod];k;k=urm[k])
if(!viz[ vf[k] ])
dfs(vf[k]);
ord[++t]=nod;
}
void dfst(int nod,int nrc)
{
viz[nod]=1;
adaugaT(nod,nrc);
comp[nod]=nrc;
for(int k=last2[nod];k;k=urm2[k])
if(!viz[ vf2[k] ])
dfst(vf2[k],nrc);
}
int main()
{
in>>n>>m;
p=n+1;
for(int k=1,i,j;k<=m;k++)
{
in>>i>>j;
adauga(p-i,p+j);
adauga(p-j,p+i);
}
for(int i=1;i<=n*2+1;i++)
if(!viz[i])
dfs(i);
nr=0;viz=0;
for(int i=n*2+1;i>=1;i--)
if(!viz[ ord[i] ])
dfst(ord[i],++nrc);
for(int i=1;i<=n;i++)
if(comp[p+i]==comp[p-i])
{
out<<-1;
return 0;
}
for(int i=nrc;i>=1;i--)
for(int k=last3[i];k;k=urm3[k])
{
int nod=abs(vf3[k]-p);
if(!val[nod])
val[nod]=(vf3[k]<p?1:2);
}
for(int i=1;i<=n;i++)
out<<val[i]-1<<' ';
return 0;
}