Pagini recente » Cod sursa (job #3284332) | Cod sursa (job #2260110) | Cod sursa (job #2658126) | Cod sursa (job #2606180) | Cod sursa (job #635)
Cod sursa(job #635)
#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;
}