Cod sursa(job #383461)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 16 ianuarie 2010 16:50:55
Problema 2SAT Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#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;
}