Cod sursa(job #387329)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 27 ianuarie 2010 12:54:00
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
using namespace std;

#include <vector>

#define FORit(it,x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); ++it)
#define non(x) (x>N?x-N:x+N)
#define pb push_back

int x,y,i,N,M,Q[1<<18];
vector<int> A[1<<18],B[1<<18];
bool V[1<<18],S[1<<18],ok(1);

void DFP(int x)
{
	V[x] = 1;
	FORit(it,A[x])
		if(!V[*it])
			DFP(*it);
	Q[++Q[0]] = x;
}

void DFM(int x)
{
	ok = !S[x];
	V[x] = S[non(x)] = 1;
	FORit(it,B[x])
		if(!V[*it])
			DFM(*it);
}

int main()
{
	freopen("2sat.in","r",stdin);
	freopen("2sat.out","w",stdout);
	
	scanf("%d%d",&N,&M);
	for(;M--;)
	{
		scanf("%d%d",&x,&y);
		x=x<0?-x+N:x;
		y=y<0?-y+N:y;
		
		A[non(x)].pb(y);
		A[non(y)].pb(x);
		B[y].pb(non(x));
		B[x].pb(non(y));
	}
	
	for(i=1;i<=N*2;++i)
		if(!V[i])
			DFP(i);
	
	memset(V,0,sizeof(V));
	
	for(i = N*2;i>=1;--i)
		if(!V[Q[i]] && !V[non(Q[i])])
			DFM(Q[i]);
	
	if(ok) for(;i = N--;) printf("%d ",S[i]);
	else printf("-1\n");
	
	return 0;
}