Cod sursa(job #569664)

Utilizator blastoiseZ.Z.Daniel blastoise Data 1 aprilie 2011 22:33:07
Problema 2SAT Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 100001

struct vector
{
	int x,y;
}v[MAX*2];

char use[MAX];
char x[MAX*2],y[MAX*2];

int main()
{
	int N,M,i,end,pos,pos1,pos2;

	freopen("2sat.in","r",stdin);

	scanf("%d%d",&N,&M);

	for(i=1;i<=M;i++)
	{
		scanf("%d%d",&v[i].x,&v[i].y);
		x[i]=1;
		y[i]=1;
		if(v[i].x<0) x[i]=-1;
		if(v[i].y<0) y[i]=-1;
	}

	srand(time(NULL));
	for(i=1;i<=N;i++) use[i]=rand()%2;

	end=0;
	while(!end)
	{
		end=1;
		pos1=rand()%M+1;
		pos2=rand()%(M-pos1+1)+pos1;

		for(i=1;i<pos1;i++)
			if(x[i]<0&&y[i]<0)
				if(!use[v[i].x*x[i]]==0&&!use[v[i].y*y[i]]==0)
				{
					end=0;
					break;
				}
				else;
			else
			if(x[i]<0&&y[i]>0)
				if(!use[v[i].x*x[i]]==0&&use[v[i].y]==0)
				{
					end=0;
					break;
				}
				else;
			else
			if(x[i]>0&&y[i]<0)
				if(use[v[i].x]==0&&!use[v[i].y*y[i]]==0)
				{
					end=0;
					break;
				}
				else;
			else
			if(x[i]>0&&y[i]>0)
				if(use[v[i].x]==0&&use[v[i].y]==0)
				{
					end=0;
					break;
				}

		if(end)
			for(i=pos1;i<pos2;i++)
				if(x[i]<0&&y[i]<0)
					if(!use[v[i].x*x[i]]==0&&!use[v[i].y*y[i]]==0)
					{
						end=0;
						break;
					}
					else;
				else
				if(x[i]<0&&y[i]>0)
					if(!use[v[i].x*x[i]]==0&&use[v[i].y]==0)
					{
						end=0;
						break;
					}
					else;
				else
				if(x[i]>0&&y[i]<0)
					if(use[v[i].x]==0&&!use[v[i].y*y[i]]==0)
					{
						end=0;
						break;
					}
					else;
				else
				if(x[i]>0&&y[i]>0)
					if(use[v[i].x]==0&&use[v[i].y]==0)
					{
						end=0;
						break;
					}

		if(end)
			for(i=pos2;i<=M;i++)
				if(x[i]<0&&y[i]<0)
					if(!use[v[i].x*x[i]]==0&&!use[v[i].y*y[i]]==0)
					{
						end=0;
						break;
					}
					else;
				else
				if(x[i]<0&&y[i]>0)
					if(!use[v[i].x*x[i]]==0&&use[v[i].y]==0)
					{
						end=0;
						break;
					}
					else;
				else
				if(x[i]>0&&y[i]<0)
					if(use[v[i].x]==0&&!use[v[i].y*y[i]]==0)
					{
						end=0;
						break;
					}
					else;
				else
				if(x[i]>0&&y[i]>0)
					if(use[v[i].x]==0&&use[v[i].y]==0)
					{
						end=0;
						break;
					}

		if(!end)
		{
			pos=rand()%2;
			if(!pos) use[v[i].x*x[i]]=!use[v[i].x*x[i]];
			else use[v[i].y*y[i]]=!use[v[i].y*y[i]];
		}
	}

	freopen("2sat.out","w",stdout);

	for(i=1;i<N;i++) printf("%d ",use[i]);
	printf("%d\n",use[N]);

	return 0;
}