Pagini recente » Cod sursa (job #872848) | Cod sursa (job #656553) | Cod sursa (job #3209045) | Cod sursa (job #606587) | Cod sursa (job #3202832)
#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;
}