Cod sursa(job #2483417)

Utilizator AlexNeaguAlexandru AlexNeagu Data 29 octombrie 2019 18:53:27
Problema Party Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
using namespace std;
ifstream in("party.in");
ofstream out("party.out");
bool wrong[105];
bool T[105][105];
vector < int > E[105];
vector < pair < int, int > > a;
vector < int > V[105];
set < int > s;
bool viz[105];
void kill(int eliminatul) {
  viz[eliminatul] = 1;
  wrong[eliminatul] = true;
  for (auto it : E[eliminatul]) {
    if (!viz[it]) {
      kill(it);
    }
  }
}
void extract_length(int node, int &x) {
  if (!wrong[node]) x++;
  viz[node] = 1;
  for (auto it : E[node]) {
    if (!viz[it]) {
      extract_length(it, x);
    }
  }
}
int main() {
  int n, m;
  in >> n >> m;
  while(m--) {
    int x, y, op;
    in >> x >> y >> op;
    if (op == 1) {
      E[x].pb(y);
      T[x][y] = 1;
    }
    else if (op == 2) {
      E[y].pb(x);
      T[y][x] = 1;
    }
    else if (op == 3) {
      a.pb({x, y});
    }
    else {
      V[x].pb(y);
      V[y].pb(x);
    }
  }
  for (int i = 1; i <= n; i++) {
    s.insert(i);
  }
  for (auto it : a) {
    if (!wrong[it.x] && wrong[it.y]) {
      s.erase(it.y);
    }
    else if (wrong[it.x] && !wrong[it.y]) {
      s.erase(it.x);
    }
    else if (!wrong[it.x] && !wrong[it.y]) {
      bool ok = false, ok1 = false;
      for (auto it1 : V[it.x]) {
        if (T[it.x][it1]) {
          ok = true;
          break;
        }
      }
      for (auto it1 : V[it.y]) {
        if (T[it.y][it1]) {
          ok = true;
          break;
        }
      }
      int eliminatul;
      if (ok && !ok1) eliminatul = it.x;
      else if (!ok && ok1) eliminatul = it.y;
      else {
        int x = 0, y = 0;
        memset(viz, 0, sizeof(viz));
        extract_length(it.x, x);
        extract_length(it.y, y);
        cout << x << " " << y << "\n";
        if (x < y) eliminatul = it.x;
        else eliminatul = it.y;
      }
      memset(viz, 0, sizeof(viz));
      kill(eliminatul);
      s.erase(eliminatul);
    }
  }
  out << s.size() << "\n";
  for (auto it : s) {
    out << it << "\n";
  }
  return 0;
}