Cod sursa(job #1301494)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 26 decembrie 2014 00:11:41
Problema Party Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 4 kb
#include <fstream>
using std::ifstream;
using std::ofstream;

#include <vector>
using std::vector;

struct cerinta{
	int x, y;
	int tip; };

enum statut{
	vine,
	nu_vine,
	nestiut };

bool creeaza_invitatii(
	const int nr_prieteni,
	vector<statut>& prieteni,
	const int nr_cerinte,
	const vector<cerinta>& cerinte,
	const int i,
	int& nr_invitati){
	if(nr_invitati <= 0){
		return false; }
	if(i >= cerinte.size()){
		return true; }
	const int tip = cerinte[i].tip,
		x = cerinte[i].x,
		y = cerinte[i].y;
	if(tip == 0){
		if(prieteni[x] == vine || prieteni[y] == vine){
			return creeaza_invitatii(
				nr_prieteni,
				prieteni,
				nr_cerinte,
				cerinte,
				i + 1,
				nr_invitati); }
		else{
			if(prieteni[x] == nestiut){
				prieteni[x] = vine;
				if(creeaza_invitatii(
					nr_prieteni,
					prieteni,
					nr_cerinte,
					cerinte,
					i + 1,
					nr_invitati)){
						return true; }
				else{
					prieteni[x] = nestiut; } }
			if(prieteni[y] == nestiut){
				prieteni[y] = vine;
				if(creeaza_invitatii(
					nr_prieteni,
					prieteni,
					nr_cerinte,
					cerinte,
					i + 1,
					nr_invitati)){
						return true; }
				else{
					prieteni[y] = nestiut; } }
			return false; } }
	else if(tip == 1){
		if(prieteni[x] == vine || prieteni[y] == nu_vine){
			return creeaza_invitatii(
				nr_prieteni,
				prieteni,
				nr_cerinte,
				cerinte,
				i + 1,
				nr_invitati); }
		else{
			if(prieteni[x] == nestiut){
				prieteni[x] = vine;
				if(creeaza_invitatii(
					nr_prieteni,
					prieteni,
					nr_cerinte,
					cerinte,
					i + 1,
					nr_invitati)){
						return true; }
				else{
					prieteni[y] = nestiut; } }
			if(prieteni[y] == nestiut){
				prieteni[y] = nu_vine;
				--nr_invitati;
				if(creeaza_invitatii(
					nr_prieteni,
					prieteni,
					nr_cerinte,
					cerinte,
					i + 1,
					nr_invitati)){
						return true; }
				else{
					prieteni[y] = nestiut;
					++nr_invitati; } }
			return false; } }
	else if(tip == 2){
		if(prieteni[y] == vine || prieteni[x] == nu_vine){
			return creeaza_invitatii(
				nr_prieteni,
				prieteni,
				nr_cerinte,
				cerinte,
				i + 1,
				nr_invitati); }
		else{
			if(prieteni[y] == nestiut){
				prieteni[y] = vine;
				if(creeaza_invitatii(
					nr_prieteni,
					prieteni,
					nr_cerinte,
					cerinte,
					i + 1,
					nr_invitati)){
						return true; }
				else{
					prieteni[x] = nestiut; } }
			if(prieteni[x] == nestiut){
				prieteni[x] = nu_vine;
				--nr_invitati;
				if(creeaza_invitatii(
					nr_prieteni,
					prieteni,
					nr_cerinte,
					cerinte,
					i + 1,
					nr_invitati)){
						return true; }
				else{
					prieteni[x] = nestiut;
					++nr_invitati; } }
			return false; } }
	else if(tip == 3){
		if(prieteni[x] == nu_vine || prieteni[y] == nu_vine){
			return creeaza_invitatii(
				nr_prieteni,
				prieteni,
				nr_cerinte,
				cerinte,
				i + 1,
				nr_invitati); }
		else{
			if(prieteni[x] == nestiut){
				prieteni[x] = nu_vine;
				--nr_invitati;
				if(creeaza_invitatii(
					nr_prieteni,
					prieteni,
					nr_cerinte,
					cerinte,
					i + 1,
					nr_invitati)){
						return true; }
				else{
					prieteni[x] = nestiut;
					++nr_invitati; } }
			if(prieteni[y] == nestiut){
				prieteni[y] = nu_vine;
				--nr_invitati;
				if(creeaza_invitatii(
					nr_prieteni,
					prieteni,
					nr_cerinte,
					cerinte,
					i + 1,
					nr_invitati)){
						return true; }
				else{
					prieteni[y] = nestiut;
					++nr_invitati; } }
			return false; } } }

int main(){
	ifstream f("party.in");
	ofstream g("party.out");
	int nr_prieteni = 0, nr_cerinte = 0;
	f >> nr_prieteni >> nr_cerinte;
	vector<statut> prieteni(nr_prieteni, nestiut);
	vector<cerinta> cerinte(nr_cerinte);
	for(int i = 0; i < nr_cerinte; ++i){
		f >> cerinte[i].x >> cerinte[i].y >> cerinte[i].tip;
		--cerinte[i].x;
		--cerinte[i].y; }
	int nr_invitati = nr_prieteni;
	creeaza_invitatii(
		nr_prieteni,
		prieteni,
		nr_cerinte,
		cerinte,
		0,
		nr_invitati);

	g << nr_invitati << '\n';
	for(int i = 0; i < nr_prieteni; ++i){
		if(prieteni[i] != nu_vine){
			g << i+1 << '\n'; } }
	return 0; }