Cod sursa(job #1292242)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 13 decembrie 2014 22:13:46
Problema Party Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <ctime>

#define TRUE 1
#define FALSE 0
#define NONE 2

int m, n, vars[101];

int main()
{
  srand(time(NULL));

  std::ifstream in("party.in");
  std::ofstream out("party.out");
  in >> n >> m;
  std::vector<std::pair<int, int> > v;
  for (int i = 0; i < m; ++i) {
    int a, b, type;
    in >> a >> b >> type;
    switch (type) {
      case 0: v.push_back(std::make_pair(a, b)); break;
      case 1: v.push_back(std::make_pair(a, -b)); break;
      case 2: v.push_back(std::make_pair(-a, b)); break;
      case 3: v.push_back(std::make_pair(-a, -b)); break;
    }
  }

  int ntrue = 0;
  for (int i = 1; i <= n; ++i) {
    vars[i] = rand() % 2;
    ntrue += vars[i];
  }

  bool all_satisfied;
  do {
    all_satisfied = true;
    for (int i = 0; i < v.size(); ++i) {
      if (!((v[i].first > 0 ? vars[v[i].first] : !vars[v[i].first]) ||
            (v[i].second > 0 ? vars[v[i].second] : !vars[v[i].second]))) {
        all_satisfied = false;
        if (rand() % 2 == 0) {
          ntrue -= vars[v[i].first];
          vars[v[i].first] ^= 1;
          ntrue += vars[v[i].first];
        } else {
          ntrue -= vars[v[i].second];
          vars[v[i].second] ^= 1;
          ntrue += vars[v[i].second];
        }
        break;
      }
    }
  } while (!all_satisfied || ntrue == 0);

  out << ntrue << std::endl;
  for (int i = 1; i <= n; ++i)
    if (vars[i] == TRUE) out << i << std::endl;

  in.close();
  out.close();

  return 0;
}