Cod sursa(job #480941)

Utilizator ooctavTuchila Octavian ooctav Data 30 august 2010 10:27:25
Problema Party Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
using namespace std;

const int NMAX = 1010;
const int MMAX = 10010;

int N, M;
int Bl[MMAX][4];
int val[NMAX];

void citire()
{
	cin >> N >> M;
	for(int i = 1 ; i <= M ; i++)
		cin >> Bl[i][1] >> Bl[i][2] >> Bl[i][0];
	fill(val + 1 , val + N + 1, 1);
}

inline void aleator(int i)
{
	int x = rand() % 2 + 1;
	val[Bl[i][x]] = !val[Bl[i][x]];
}

bool satisfactie()
{
	for(int i = 1 ; i <= M ; i++)
		switch(Bl[i][0])
		{
		case 0:
			if(!val[Bl[i][1]] && !val[Bl[i][2]])
			{
				aleator(i);
				return 0;
			}
		case 1:
			if(!val[Bl[i][1]] && val[Bl[i][2]])
			{
				aleator(i);
				return 0;
			}
		case 2:
			if(val[Bl[i][1]] && !val[Bl[i][2]])
			{
				aleator(i);
				return 0;
			}
		case 3:
			if(val[Bl[i][1]] && val[Bl[i][2]])
			{
				aleator(i);
				return 0;
			}
		}
	return 1;
}

void scriere()
{
	int NR = 0;
	for(int i = 1 ; i <= N ; i++)
		if(val[i])
			NR++;
	printf("%d\n", NR);
	for(int i = 1 ; i <= N ; i++)
		if(val[i])
			printf("%d ", val[i]);
}

int main()
{
	freopen("party.in", "r", stdin);
	freopen("party.out", "w", stdout);
	citire();
	srand(time(NULL));
	while(!satisfactie());
	scriere();
	return 0;
}