Pagini recente » Cod sursa (job #1178493) | Cod sursa (job #290684) | Cod sursa (job #2287338) | Cod sursa (job #1943105) | Cod sursa (job #2927758)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> G[2][100001];
bool viz[2][100001];
vector<int> ord;
vector<int> comp[100001];
void dfs(int root) {
viz[0][root] = true;
for(auto it: G[0][root])
if(!viz[0][it])
dfs(it);
ord.push_back(root);
}
void dfs_rev(int root, int c) {
viz[1][root] = true;
comp[c].push_back(root);
for (auto it: G[1][root])
if(!viz[1][it])
dfs_rev(it, c);
}
int main() {
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
int N, M;
scanf("%d %d", &N, &M);
while(M --) {
int a, b;
scanf("%d %d", &a, &b);
G[0][a].push_back(b);
G[1][b].push_back(a);
}
for(int i = 1; i <= N; i ++)
if(!viz[0][i])
dfs(i);
int C = 0;
reverse(ord.begin(), ord.end());
for(auto it: ord)
if(!viz[1][it])
dfs_rev(it, C++);
printf("%d\n", C);
for (int cmp = 0; cmp < C; cmp ++) {
for(auto it: comp[cmp])
printf("%d ", it);
printf("\n");
}
return 0;
}