Cod sursa(job #635)

Utilizator byndrsnAlina Ene byndrsn Data 11 decembrie 2006 17:21:49
Problema Party Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>

/* @byndrsn, party, infoarena.ro */

int N, M;
bool val[105];	// truth assignment
int C[2005][2];	// clauses	

int done(void) {
	for (int i = 0; i < M; ++ i) {
		bool a = (C[i][0] < N) ? val[C[i][0]] : !val[C[i][0] - N];
		bool b = (C[i][1] < N) ? val[C[i][1]] : !val[C[i][1] - N];

		if (!a && !b)
			return i;
	}
	
	return -1;
}

void go(void) {
	srand(time(0));
	
	for (int i = 0; i < N; ++ i)
		val[i] = rand() % 2;

	while (true) {
		int pos = done();

		if (pos == -1)
			break;
		
		int i = rand() % 2;
		int x = (C[pos][i] < N) ? C[pos][i] : (C[pos][i] - N);	
		val[x] = !val[x];
	}
	
	int ret = 0;
	for (int i = 0; i < N; ++ i)
		if (val[i])
			++ ret;
	
	if (ret == 0) {
		go();
		return;
	}

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

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

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

	scanf("%d %d", &N, &M);
	int a, b, c;

	for (int i = 0; i < N; ++ i) {
		scanf("%d %d %d", &a, &b, &c);
		-- a, -- b;
		
		if (c == 0) {	// a v b 
			C[i][0] = a; C[i][1] = b;
		}

		if (c == 1) {	// a v ~b
			C[i][0] = a; C[i][1] = N + b;
		}

		if (c == 2) {	// ~a v b
			C[i][0] = N + a; C[i][1] = b;
		}

		if (c == 3) {	// (~a v ~b)
			C[i][0] = N + a; C[i][1] = N + b;
		}
	}
	
	//fprintf(stderr, "NC: %d\n", NC);

	go();

	return 0;
}