Cod sursa(job #3296193)

Utilizator RaresHRares Hanganu RaresH Data 12 mai 2025 09:55:19
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <vector>

const int MAX_N = 200'000;

FILE *fin, *fout;
std::vector<int> adj[MAX_N];
std::vector<int> adjt[MAX_N];
char vis[MAX_N];

void dfs(int node, std::vector<int> &order) {
  vis[node] = 1;
  for(int v : adj[node]) {
    if(!vis[v]) {
      dfs(v, order);
    }
  }
  order.push_back(node);
}

void dfs2(int node, std::vector<int> &component) {
  vis[node] = 0;
  component.push_back(node);
  for(int v : adjt[node]) {
    if(vis[v]) {
      dfs2(v, component);
    }
  }
}

int main() {
  fin = fopen("ctc.in", "r");
  fout = fopen("ctc.out", "w");

  int n, m;
  fscanf(fin, "%d%d", &n, &m);
  for(int i = 0; i < m; i++) {
    int u, v;
    fscanf(fin, "%d%d", &u, &v);
    u--;
    v--;
    adj[u].push_back(v);
    adjt[v].push_back(u);
  }

  std::vector<int> order;
  for(int i = 0; i < n; i++) {
    if(!vis[i]) {
      dfs(i, order);
    }
  }

  std::vector<std::vector<int>> ctc;
  for(int i = n - 1; i >= 0; i--) {
    if(vis[order[i]]) {
      std::vector<int> component;
      dfs2(order[i], component);
      ctc.push_back(component);
    }
  }

  fprintf(fout, "%d\n", (int)ctc.size());
  for(std::vector<int> &c : ctc) {
    for(int x : c) {
      fprintf(fout, "%d ", x + 1);
    }
    fprintf(fout, "\n");
  }

  fclose(fin);
  fclose(fout);

  return 0;
}