Cod sursa(job #2789506)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 27 octombrie 2021 16:50:15
Problema Party Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <bits/stdc++.h>

#define vi vector<int>
#define pb push_back

using namespace std;

ifstream in("party.in");
ofstream out("party.out");

const int maxN = 205;

int n, m;

vi g[maxN], r[maxN], scc[maxN];

vi st;

int comp[maxN], deg[maxN], result[maxN];

bool used[maxN];

int f(int x) {
  if (x < 0) {
    return n + abs(x);
  }
  return x;
}

int inv(int x) {
  if (x <= n) {
    return x + n;
  }
  return x - n;
}

void dfs(int u) {
  used[u] = true;
  for (int v : g[u]) {
    if (!used[v]) {
      dfs(v);
    }
  }
  st.pb(u);
}

void dfs2(int u, int cnt) {
  used[u] = true;
  scc[cnt].pb(u);
  comp[u] = cnt;
  for (int v : r[u]) {
    if (!used[v]) {
      dfs2(v, cnt);
    }
  }
}

void add(int u, int v) {
  g[u].pb(v);
  r[v].pb(u);
}

int main() {
  in >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v, z;
    in >> u >> v >> z;
    if (z == 1) {
      v = -v;
    } else if (z == 2) {
      u = -u;
    } else {
      v = -v;
      u = -u;
    }
    u = f(u), v = f(v);
    add(inv(u), v);
    add(inv(v), u);
  }
  for (int i = 1; i <= 2 * n; i++) {
    if (!used[i]) {
      dfs(i);
    }
  }
  reverse(st.begin(), st.end());
  fill(used, used + maxN, false);
  int cnt = 0;
  for (int v : st) {
    if (!used[v]) {
      dfs2(v, cnt++);
    }
  }
  for (int i = 1; i <= 2 * n; i++) {
    for (int v : g[i]) {
      int a = comp[i], b = comp[v];
      if (a != b) {
        deg[b]++;
      }
    }
  }
  queue<int> q;
  for (int i = 0; i < cnt; i++) {
    if (!deg[i]) {
      q.push(i);
    }
  }
  fill(result, result + maxN, -1);
  while ((int)q.size() > 0) {
    int u = q.front();
    q.pop();
    for (int v : scc[u]) {
      int x = v;
      if (x > n) {
        x -= n;
      }
      if (result[x] == -1) {
        if (v <= n) {
          result[x] = 0;
        } else {
          result[x] = 1;
        }
      }
    }
    for (int v : scc[u]) {
      for (int x : g[v]) {
        int a = comp[v], b = comp[x];
        if (a != b) {
          if (--deg[b] == 0) {
            q.push(b);
          }
        }
      }
    }
  }
  out << count(result + 1, result + n + 1, 1) << "\n";
  for (int i = 1; i <= n; i++) {
    if (result[i] == 1) {
      out << i << "\n";
    }
  }
  return 0;
}