Cod sursa(job #517575)

Utilizator AndreyPAndrei Poenaru AndreyP Data 29 decembrie 2010 11:45:05
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <bitset>
using namespace std;
#define N 110
#define M 1010
#define fs first
#define sc second
#define mp make_pair
#define pii pair< int,int >

int n,m;
pair< pii,int > cer[M];
bitset< N > rez;

inline void citire() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=m; ++i)
		scanf("%d%d%d",&cer[i].fs.fs,&cer[i].fs.sc,&cer[i].sc);
}

inline bool vezi(int x) {
	int a = cer[x].fs.fs;
	int b = cer[x].fs.sc;
	if(cer[x].sc==0)
		return (rez[a]==1 || rez[b]==1);
	if(cer[x].sc==1)
		return (rez[a]==1 || (rez[a]==0 && rez[b]==0));
	if(cer[x].sc==2)
		return (rez[b]==1 || (rez[a]==0 && rez[b]==0));
	return (rez[a]==0 || rez[b]==0);
}

inline void rezolva() {
	srand(time(NULL));

	int cati0 = n,unde;
	bool go = true,ok;
	int a,b;

	while(go) {
		ok = true;
		for(int i=1; i<=m && ok; ++i) {
			if(vezi(i)==false) {
				unde = i;
				ok = false;
			}
		}

		if(ok==false) {
			a = cer[unde].fs.fs;
			b = cer[unde].fs.sc;
			if(rand()&1) {
				rez[a] = ( (rez[a]==1) ? (0) : (1) );
				if(rez[a]==0)
					++cati0;
				else
					--cati0;
			} else {
				rez[b] = ( (rez[b]==1) ? (0) : (1) );
				if(rez[b]==0)
					++cati0;
				else
					--cati0;
			}
			continue;
		}

		if(cati0==n) {
			a = rand()%n + 1;
			rez[a] = 1;
			--cati0;
			continue;
		}

		go = false;
	}
}

inline void scrie() {
	int nrez = 0;
	for(int i=1; i<=n; ++i) {
		if(rez[i]==1)
			++nrez;
	}

	printf("%d\n",nrez);
	for(int i=1; i<=n; ++i) {
		if(rez[i]==1)
			printf("%d\n",i);
	}
}


int main() {
	freopen("party.in","r",stdin);
	freopen("party.out","w",stdout);

	citire();
	rezolva();
	scrie();

	return 0;
}