Cod sursa(job #3356520)

Utilizator BurloiEmilAndreiBurloi Emil Andrei BurloiEmilAndrei Data 2 iunie 2026 10:05:45
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#warning That's not NP, that's my NP!
using namespace std;

vector<vector<int>> adj, adj_t;
vector<bool> vis;
vector<int> order, comp;

void dfs_order(int u) {
  vis[u] = true;
  for (auto v : adj[u]) {
    if (!vis[v]) {
      dfs_order(v);
    }
  }
  order.push_back(u);
}

void dfs_comp(int u, int c) {
  comp[u] = c;
  for (auto v : adj_t[u]) {
    if (comp[v] == -1) {
      dfs_comp(v, c);
    }
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  ifstream cin("ctc.in");
  ofstream cout("ctc.out");

  int n, m;
  cin >> n >> m;
  adj = adj_t = vector<vector<int>>(n);
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--; b--;
    adj[a].push_back(b);
    adj_t[b].push_back(a);
  }
  vis = vector<bool>(n, false);
  for (int i = 0; i < n; i++) {
    if (!vis[i]) {
      dfs_order(i);
    }
  }
  reverse(order.begin(), order.end());
  comp = vector<int>(n, -1);
  vector<int> comps;
  for (auto u : order) {
    if (comp[u] == -1) {
      dfs_comp(u, comps.size() + 1);
      comps.push_back(comps.size() + 1);
    }
  }
  cout << comps.size() << "\n";
  map<int, vector<int>> l_comp;
  for (int i = 0; i < n; i++) {
    l_comp[comp[i]].push_back(i + 1);
  }
  for (auto [comp, l] : l_comp) {
    for (auto x : l) {
      cout << x << " ";
    }
    cout << "\n";
  }
  return 0;
}