Cod sursa(job #468817)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 5 iulie 2010 11:15:04
Problema Party Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define NMAX 105
#define LMAX 1005
int n,m,sol[NMAX];
struct muchie
{
	int a,b,c;
};
muchie A[LMAX];
void read()
{
	scanf("%d%d",&n,&m);
	int i;
	for (i=1; i<=m; i++)
		scanf("%d%d%d",&A[i].a,&A[i].b,&A[i].c);
}
bool eval(int t)
{
	int x=A[t].c,y=A[t].a,z=A[t].b;
	if (x==0)
		return sol[y] | sol[z];
	if (x==1 && sol[y]==0 && sol[z]==1)
		return 0;
	if (x==2 && sol[z]==0 && sol[y]==1)
		return 0;
	if (x==3)
		return !sol[y] | !sol[z];
	return 1;
}
void solve()
{
	srand(time(0));
	int i,j,found,failed,nr1=0;
	for (i=1; i<=n; i++)
	{
		sol[i]=rand()%2;
		if (sol[i])
			nr1++;
	}
	for (i=1; i<=n*20; i++)
	{
		found=1; 
		for (j=1; j<=m; j++)
			if (!eval(j))
			{
				found=0;
				failed=j;
				break ;
			}
		if (found && nr1>0)
			return ;
		if (found)
			failed=1;
		if (rand()%2==0)
		{
			sol[A[failed].a]^=1;
			if (sol[A[failed].a])
				nr1--;
			else
				nr1++;
		}
		else
		{
			sol[A[failed].b]^=1;
			if (sol[A[failed].b])
				nr1--;
			else
				nr1++;
		}
	}
}
void show()
{
	int i,nr=0;
	for (i=1; i<=n; i++)
		if (sol[i]) 
			nr++;
	printf("%d\n",nr);
	for (i=1; i<=n; i++)
		if (sol[i])
			printf("%d\n",i);
}
int main()
{
	freopen("party.in","r",stdin);
	freopen("party.out","w",stdout);
	read();
	solve();
	show();
	return 0;
}