Cod sursa(job #307277)

Utilizator cypryCiprian Oprisa cypry Data 23 aprilie 2009 20:20:55
Problema Party Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define FLIP_MAX 100000

typedef struct{
	int x,y,xn,yn;
}conditie;

int val[101];

int eval(conditie c){
	int a = val[c.x];
	int b = val[c.y];
	if(c.xn) a = !a;
	if(c.yn) b = !b;
	return (a || b);
}

conditie cond[1001];
int nrC,flipNo;
int n,m;

void citire(void){
	FILE *f=fopen("party.in","r");
	fscanf(f,"%d %d",&n,&m);
	int i,x,y,z;
	for(i=0;i<m;++i){
		fscanf(f,"%d %d %d",&x,&y,&z);
		cond[nrC].x=x;
		cond[nrC].y=y;
		cond[nrC].xn=0;
		cond[nrC].yn=0;
		switch(z){
			case 0:
				++nrC;
				break;
			case 1:
				cond[nrC].yn=1;
				++nrC;
				break;
			case 2:
				cond[nrC].xn=1;
				++nrC;
				break;
			case 3:
				cond[nrC].yn=1;
				++nrC;
				cond[nrC].x=x;
				cond[nrC].y=y;
				cond[nrC].xn=1;
				++nrC;
				break;
		}
	}
	fclose(f);
	for(i=1;i<=n;++i)
		val[i] = 1;
}

int flip(){
	++flipNo;
	return ( rand()%2 );
}

void find(){
	int nr=0;
	while(nr<nrC && flipNo<FLIP_MAX){
		if( eval(cond[nr]) ){
			++nr;
		}else{
			if( flip() ){
				val[ cond[nr].x ] = !val[ cond[nr].x ];
			}else{
				val[ cond[nr].y ] = !val[ cond[nr].y ];
			}
			nr = 0;
		}
	}
}

void scrie(void){
	int i;
	int nr=0;
	for(i=1;i<=n;++i)
		if(val[i])
			++nr;
	FILE *f=fopen("party.out","w");
	fprintf(f,"%d\n",nr);
	for(i=1;i<=n;++i)
		if(val[i])
			fprintf(f,"%d\n",i);
	fclose(f);
}


int main(void){
	srand(time(NULL));
	citire();
	find();
	scrie();
	return 0;
}