Pagini recente » Cod sursa (job #2823160) | Cod sursa (job #1835363) | Cod sursa (job #2654057) | Cod sursa (job #950756) | Cod sursa (job #3296190)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
const int MAXN = 100000;
vector<int> g[MAXN + 1], tg[MAXN + 1], order, noduri[MAXN + 1];
int viz[MAXN + 1], ctc;
void dfs(int node) {
viz[node] = 1;
for(int vecin : g[node]) {
if(!viz[vecin]) {
dfs(vecin);
}
}
order.push_back(node);
}
void dfs2(int node) {
viz[node] = 1;
noduri[ctc].push_back(node);
for(int vecin : tg[node]) {
if(!viz[vecin]) {
dfs2(vecin);
}
}
}
int main() {
int n, m;
fin >> n >> m;
for(int i = 1; i <= m; i++) {
int u, v;
fin >> u >> v;
g[u].push_back(v);
tg[v].push_back(u);
}
for(int i = 1; i <= n; i++) {
if(!viz[i]) {
dfs(i);
}
}
for(int i = 1; i <= n; i++) {
viz[i] = 0;
}
for(int i = n - 1; i >= 0; i--) {
if(!viz[order[i]]) {
ctc++;
dfs2(order[i]);
}
}
fout << ctc << "\n";
for(int i = 1; i <= ctc; i++) {
for(int nod : noduri[i]) {
fout << nod << " ";
}
fout << "\n";
}
return 0;
}