Pagini recente » Cod sursa (job #2621327) | Cod sursa (job #2341277) | Cod sursa (job #1850406) | Cod sursa (job #1725582) | Cod sursa (job #383461)
Cod sursa(job #383461)
#include<stdio.h>
#define non(x) x<=n?x+n:x-n
#define nod(x) x>0?x:n-x
struct Nod{int inf;Nod *next;};
Nod *v[200001],*T[200001],*paux;
int n,m,i,nc,N,u,b,ct,L[200001],D[200001],V[200001],CT[200001],S[200001];
void read(),solve(),visit(int p),GI();
int main()
{
read();
solve();
return 0;
}
void read()
{
Nod *q;int x,y,X,Y;
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d%d",&n,&m);
for(;m;m--)
{
scanf("%d%d",&x,&y);
x=nod(x);X=non(x);
y=nod(y);Y=non(y);
q=new Nod;q->inf=y;q->next=v[X];v[X]=q;
q=new Nod;q->inf=x;q->next=v[Y];v[Y]=q;
}
}
void solve()
{
int val;Nod *q,*r;
m=2*n;for(i=1;i<=m;i++)
if(!V[i])
{
N=0;
visit(i);
}
for(i=1;i<=n;i++)if(CT[i]==CT[non(i)]){printf("-1\n");return;}
GI();b=1;
for(;b<=nc;)
{
ct=S[b++];val=0;
for(q=T[ct];q;q=q->next)
{
if(V[q->inf]!=-1)val=V[q->inf];
for(r=v[q->inf];r;r=r->next)
{
if(CT[q->inf]==CT[r->inf])continue;
L[CT[r->inf]]--;
if(!L[CT[r->inf]])S[++u]=CT[r->inf];
}
}
for(q=T[ct];q;q=q->next)
{
V[q->inf]=val;V[non(q->inf)]=1-val;
}
}
for(i=1;i<=n;i++)printf("%d ",V[i]);
printf("\n");
}
void visit(int p)
{
Nod *q;
V[p]=1;S[++u]=p;N++;D[p]=N;L[p]=N;
for(q=v[p];q;q=q->next)
{
if(!V[q->inf])visit(q->inf);
L[p]=(L[p]<L[q->inf])?L[p]:L[q->inf];
}
if(L[p]==D[p])
{
nc++;
while(u&&L[S[u]]==L[p])
{
paux=new Nod;paux->inf=S[u];paux->next=T[nc];T[nc]=paux;
CT[S[u]]=nc;u--;
}
}
}
void GI()
{
Nod *q;
for(i=1;i<=m;i++){V[i]=-1;L[i]=0;}
for(i=1;i<=m;i++)
for(q=v[i];q;q=q->next)
{
if(CT[i]!=CT[q->inf])L[CT[q->inf]]++;
}
for(i=1;i<=nc;i++)if(!L[i])S[++u]=i;
}