Pagini recente » Cod sursa (job #2737091) | Cod sursa (job #1100645) | Cod sursa (job #1385941) | Cod sursa (job #1783428) | Cod sursa (job #1542314)
#include<fstream>
#include<cstring>
using namespace std;
typedef struct celula {
int nod;
celula *next;
}*lista;
lista graf[200005],tgraf[200005],v;
int i,j,n,m,x,y,st[400005],stlev,sol[400005];
bool viz[400005], ok;
int negat(int x) {
if (x<=n) return n+x;
return x-n;
}
void muchie(int x, int y) {
v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
v=new celula; v->nod=x; v->next=tgraf[y]; tgraf[y]=v;
}
void dfs(int nod) {
viz[nod]=1;
for (lista p=graf[nod]; p; p=p->next)
if (viz[p->nod]==0) dfs(p->nod);
st[++stlev]=nod;
}
void dfst(int nod) {
if (ok==0) return;
if (sol[nod]==1) { ok=0; return; }
sol[negat(nod)]=1;
viz[nod]=1;
viz[negat(nod)]=1;
for (lista p=tgraf[nod]; p; p=p->next)
if (ok&&viz[p->nod]==0) dfst(p->nod);
}
int main(void) {
ifstream cin("2sat.in");
ofstream cout("2sat.out");
cin>>n>>m;
for (i=1; i<=m; ++i) {
cin>>x>>y;
if (x<0) x=n-x;
if (y<0) y=n-y;
muchie(negat(x),y);
muchie(negat(y),x);
}
for (i=1; i<=2*n; ++i)
if (viz[i]==0) dfs(i);
ok=1;
memset(viz,0,sizeof(viz));
for (i=stlev; i>=1; --i)
if (viz[st[i]]==0) dfst(st[i]);
if ( !ok ) cout<<"-1";
else for (i=1; i<=n; ++i) cout<<sol[i]<<" ";
return 0;
}