Cod sursa(job #1082773)

Utilizator deneoAdrian Craciun deneo Data 14 ianuarie 2014 21:51:44
Problema Party Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <iostream>
#include <cstdlib>

std::ifstream fin("party.in");
std::ofstream fout("party.out");

#define For(i, st, dr) for (int (i) = (st); (i) <= (dr); ++(i))

const int MAXN = 110;
const int MAXM = 1100;

int n, m, sol[MAXN], expresie[MAXM][2];

void read() {
    fin >> n >> m;

    For (i, 1, m) {
        int type;
        fin >> expresie[i][0] >> expresie[i][1] >> type;

        if (type == 1 || type == 3) expresie[i][1] = -expresie[i][1];
        if (type == 2 || type == 3) expresie[i][0] = -expresie[i][0];
    }
}

bool eval(int a, int b) {
    int x, y;

    x = sol[std::abs(a)];
    y = sol[std::abs(b)];

    if (a < 0) x ^= 1;
    if (b < 0) y ^= 1;

    return x | y;
}

void solve() {
    For (i, 1, n)
        sol[i] = rand() % 2;

    for(;;) {
        int poz = 0;
        For (i, 1, m) {
            if (!eval(expresie[i][0], expresie[i][1])) {
                poz = i;
                break;
            }
        }
        if (!poz) break;
        if ((rand() % 2) == 0)
            sol[expresie[poz][0]] ^= 1;
        else
            sol[expresie[poz][1]] ^= 1;
    }
}

void print() {
    int sum = 0;
    For (i, 1, n)
        sum += sol[i];

    fout << sum << "\n";

    For (i, 1, n)
        if (sol[i])
            fout << i << "\n";
}

int main() {
    read();
    solve();
    print();
    return 0;
}