Cod sursa(job #3202832)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 12 februarie 2024 12:50:20
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#define L 100005
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");

int n, m, ctcIndex;
vector <int> G[L], G_reversed[L], topologicalSorting, ctc[L];
bool vis[L];

void dfs(int node) {
  vis[node] = true;
  for (auto it : G[node])
    if (!vis[it])
      dfs(it);
  topologicalSorting.push_back(node);
}

void clearVis() {
  for (int i = 1; i <= n; i++)
    vis[i] = false;
}

void createStrongComponent(int node) {
  ctc[ctcIndex].push_back(node);
  vis[node] = true;
  for (auto it : G_reversed[node])
    if (!vis[it])
      createStrongComponent(it);
}

int main() {
  fin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int a, b;
    fin >> a >> b;
    G[a].push_back(b);
    G_reversed[b].push_back(a);
  }

  for (int i = 1; i <= n; i++) {
    if (vis[i])
      continue;
    dfs(i);
  }
  clearVis();
  reverse(topologicalSorting.begin(), topologicalSorting.end());
  for (auto it : topologicalSorting) {
    if (vis[it])
      continue;
    createStrongComponent(it);
    ctcIndex++;
  }

  fout << ctcIndex << "\n";
  for (int i = 0; i < ctcIndex; i++) {
    for (auto it : ctc[i])
      fout << it << " ";
    fout << "\n";
  }
  return 0;
}