Cod sursa(job #2610547)

Utilizator RobertLicaRobert Lica RobertLica Data 5 mai 2020 00:11:12
Problema Componente tare conexe Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb

#include <bits/stdc++.h>

#define FILE_I "ctc.in"
#define FILE_O "ctc.out"

class Task {
  int n, m, no_ctc = 0;
  std::vector< std::vector<int>> adj;
  std::vector< std::vector<int>> adj_t; // transpusa
  std::vector<int> t_out;
  std::vector< std::vector<int>> solutie;
  int pas = 1;

 public:
  void solve() {
    read();
    fa();
    print();
  }

 private:
  void read() {
    std::ifstream fin(FILE_I);
    fin >> n >> m;
    adj.resize(n + 1);
    adj_t.resize(n + 1);
    int x, y;
    for (int i = 0; i < m; ++i) {
      fin >> x >> y;
      adj[x].push_back(y);
      adj_t[y].push_back(x); // transpusa
    }
    fin.close();
  }

  void fa() {
    sortare_timp_iesire(); // in t_out

    parcurge_transpusa();
  }

// DFS ul de sortare
  void sortare_timp_iesire() {
    std::vector<int> vizitat(n + 1, 0);
    for (int i = 1; i <= n; ++i) {
      if (vizitat[i] == 0) {
        dfs(i, vizitat);
        t_out.push_back(i);
      }
    }
    std::reverse(t_out.begin(), t_out.end());
  }

  void dfs(int nod, std::vector<int> &vizitat) {
    vizitat[nod] = 1;
    for (auto &x : adj[nod]) {
      if (vizitat[x] == 0) {
        dfs(x, vizitat);
        t_out.push_back(x);
      }
    }
  }

// parcurgerea mortului aluia
  void parcurge_transpusa() {
    std::vector<int> vizitat(n + 1, 0);
    for (auto &x : t_out) {
      if (vizitat[x] == 0) {
        ++no_ctc;
        std::vector<int> rand_solutie;
        dfs_transpusa(x, vizitat, rand_solutie);
        solutie.push_back(rand_solutie);
      }
    }
  }

  void dfs_transpusa(int nod, std::vector<int> &vizitat, std::vector<int> &rand_solutie) {
    vizitat[nod] = 1;
    rand_solutie.push_back(nod);
    for (auto x : adj_t[nod]) {
      if (vizitat[x] == 0) {
        dfs_transpusa(x, vizitat, rand_solutie);
      }
    }
  }

  void print() {
    std::ofstream fout (FILE_O);
    fout << no_ctc << std::endl;
    for (auto &x : solutie) {
      for (auto &y : x) {
        fout << y << " ";
      }
      fout << std::endl;
    }
    fout.close();
  }
};

int main() {
  Task *t = new Task();
  t->solve();
  delete t;
  return 0;
}