Cod sursa(job #114259)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 13 decembrie 2007 16:53:15
Problema Party Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <time.h>
#include <stdlib.h>

#define fin  "party.in"
#define fout "party.out"

const int Nmax = 101;
const int Mmax = 1001;

int N,M,stare[Nmax],reqx[Mmax],reqy[Mmax],reqt[Mmax];
int lst[Mmax];

void readdata()
{
	int i;

	freopen(fin,"r",stdin);

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

	for (i=1;i<=M;++i)
		scanf("%d%d%d",&reqx[i],&reqy[i],&reqt[i]);
}

void solve()
{
	int i,j,x,y,val=0,cnt=0;

	srand(time(0));

	for (i=1;i<=N;++i)
		if (rand()&3)
			stare[i]=1;
		else
			stare[i]=0;

	for (;;)
	{
		lst[0]=0;
		for (i=1;i<=M;++i)
		{
			x=stare[reqx[i]];
			y=stare[reqy[i]];
			if ( reqt[i] == 0 )
				val=( x | y ); 
			if ( reqt[i] == 1 )
				val=( x | (y^1) );
			if ( reqt[i] == 2 )
				val=( (x^1) | y );
			if ( reqt[i] == 3 )
				val=( (x^1) | (y^1) );
			if ( val == 0 )
			{
				++lst[0];
				lst[lst[0]]=i;
			}
		}
		
		cnt=0;

		for (j=1;j<=N;++j)
			cnt+=stare[j];

		if ( lst[0]==0 && cnt ) break;

		if ( lst[0] )
		{
			i = lst[ rand()%lst[0] + 1 ];
	
			if ( rand()&3 )
				stare[ reqx[i] ] ^=1;
	   		else
				stare[ reqy[i] ] ^=1;	
		}
	}
	
	cnt=0;

	for ( i = 1; i <= N ; ++i )
		cnt+=stare[i];

	freopen(fout,"w",stdout);

	printf("%d\n",cnt);

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

int main()
{
	readdata();
	solve();
	return 0;
}