Cod sursa(job #383533)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 16 ianuarie 2010 19:55:27
Problema Party Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>

#define file_in "party.in"
#define file_out "party.out"

int n,m,x[100000],y[100000],v[100000],rez,poz,tip,nr,sol[1000000];

inline int abs(int a) { return a>=0?a:-a; }

int verif(int i)
{
	int a,b;
	a=v[abs(x[i])];
	b=v[abs(y[i])];
	if (x[i]<0)
		a^=1;
	if (y[i]<0)
		b^=1; 
	return a|b;		
}

int ok()
{
	for (int i=1;i<=m;++i)
		 if (!verif(i))
			 return 0;
		 return 1;
}

int main()
{
	int i,j;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &m);
	
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %d", &x[i], &y[i],&tip);
		if (tip==1) y[i]=-y[i];
		if (tip==2) x[i]=-x[i];
		if (tip==3) x[i]=-x[i],y[i]=-y[i];
	}
		
	
	srand(time(0));
	for (i=1;i<=n;++i)
		 v[i]=rand()%2;
	
	for (i=0;i<=n*25;++i)
	{
		rez=1;
		for (j=1;j<=m;++j)
		{
			rez&=verif(j);
			if (!rez)
			{
				poz=j;
				break;
			}
		}
		if (rez==1)
		{
			nr=0;
			for (j=1;j<=n;++j)
				//printf("%d ", v[j]);
				if (v[j]) sol[++nr]=j;
			printf("%d\n", nr);
			for (j=1;j<=nr;++j) printf("%d\n", sol[j]);	
			return 0;
		}
		if (rand()%2==0)
			v[abs(x[poz])]^=1;
		else
			v[abs(y[poz])]^=1;
	}
	
	//printf("-1\n");
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}