Cod sursa(job #1169811)

Utilizator denisx304Visan Denis denisx304 Data 12 aprilie 2014 04:02:09
Problema Party Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
ifstream f("party.in");
ofstream g("party.out");
#define nmax 105

bool val[nmax], sat[1005];
int n, m, x[nmax], y[nmax], z[nmax], sol;

bool satisfiable(int i)
{

    //cout << val[x[i]] << " " << val[y[i]] << " " << z[i] << " " << endl;
    if (z[i] == 0)
        if ((val[x[i]] || val[y[i]]) == 0)
            return false;
    if (z[i] == 1)
        if ((val[x[i]] || !val[y[i]]) == 0)
            return false;
    if (z[i] == 2)
        if ((!val[x[i]] || val[y[i]]) == 0)
            return false;
    if (z[i] == 3)
        if ((!val[x[i]] || !val[y[i]]) == 0)
            return false;
    return true;

}

int main()
{
    f >> n >> m;
    for (int i = 0; i < m; i ++)
        f >> x[i] >> y[i] >> z[i];
    srand(time(NULL));
    for (int i = 1; i <= n; i ++)
        val[i] = rand() % 2;
    for (int i = 0; i < m; i ++)
    {
        sat[i] = satisfiable(i);
        if (!sat[i])
        {
            bool luck = rand() % 2;
            if (luck)
                val[x[i]] = !val[x[i]];
            else
                val[y[i]] = !val[y[i]];
            sat[i] = satisfiable(i);
        }
    }
    for (int i = 1; i <= n; i ++)
        sol += val[i];
    g << sol << '\n';
    for (int i = 1; i <= n; i ++)
        if (val[i])
            g << i << '\n';

    f.close();
    g.close();
    return 0;

}