Cod sursa(job #2059024)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 6 noiembrie 2017 16:10:52
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#include <vector>
using namespace std;
const int NMAX = 100005;
vector <int> v[NMAX];
vector <int> gv[NMAX];
vector <int> sol[NMAX];
int nrsol = 0;
int st[NMAX];
bool vf[NMAX];
void dfs(int i) {
  vf[i] = 1;
  for(auto j : v[i]) {
    if(!vf[j]) {
      dfs(j);
    }
  }
  st[++st[0]] = i;
}
void gdfs(int i) {
  vf[i] = 1;
  sol[nrsol].push_back(i);
  for(auto j : gv[i]) {
    if(!vf[j]) {
      gdfs(j);
    }
  }
}

int main() {
  int n, m;
  freopen("ctc.in", "r", stdin);
  freopen("ctc.out", "w", stdout);
  scanf("%d%d", &n, &m);
  for(int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
    gv[y].push_back(x);
  }
  for(int i = 1; i <= n; ++i) {
    if(!vf[i]) {
      dfs(i);
    }
  }
  for(int i = 1; i <= n; ++i) {
    vf[i] = 0;
  }
  for(int i = n; i ; --i) {
    if(!vf[st[i]]) {
      ++nrsol;
      gdfs(st[i]);
    }
  }
  printf("%d\n", nrsol);
  for(int i = 1; i <= nrsol; ++i) {
    for(auto j : sol[i]) {
      printf("%d ", j);
    }
    printf("\n");
  }
  return 0;
}