Cod sursa(job #1292104)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 13 decembrie 2014 17:30:51
Problema Party Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>

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

int vars[101];
bool expanded[101];
std::vector<int> neigh[101][2];

void gen(int node) {
  if (expanded[node]) return;
  expanded[node] = true;

  std::vector<int>& lneigh = neigh[node][vars[node]];
  for (int i = 0; i < lneigh.size(); ++i) {
    if (lneigh[i] > 0) {
      if (vars[lneigh[i]] == FALSE) {
        exit(0);
      }
      vars[lneigh[i]] = TRUE;
      gen(lneigh[i]);
    } else {
      if (vars[-lneigh[i]] == TRUE) {
        exit(0);
      }
      vars[-lneigh[i]] = FALSE;
      gen(-lneigh[i]);
    }
  }
}

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

  for (int i = 1; i <= n; ++i) vars[i] = NONE;
  for (int i = 1; i <= n; ++i) {
    if (vars[i] == NONE) {
      vars[i] = TRUE;
      gen(i);
    }
  }

  int ntrue = 0;
  for (int i = 1; i <= n; ++i) ntrue += (vars[i] == TRUE ? 1 : 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;
}