Pagini recente » Cod sursa (job #1934774) | Cod sursa (job #2615918) | Cod sursa (job #1544433) | Cod sursa (job #2555661) | Cod sursa (job #2335420)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
vector< int > gr[MAXN];
vector< int > gri[MAXN];
vector< int > order;
vector< int > sol[MAXN];
int cnt = 0;
bool viz[MAXN];
void dfs(int node) {
viz[node] = 1;
for(auto &x : gr[node]) {
if(!viz[x]) dfs(x);
}
order.emplace_back(node);
}
void dfs1(int node) {
viz[node] = 0;
sol[cnt].emplace_back(node);
for(auto &x : gri[node]) {
if(viz[x]) dfs1(x);
}
}
int main() {
#ifdef BLAT
freopen("input", "r", stdin);
#else
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
#endif
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < m; ++i) {
int a, b;
scanf("%d%d", &a, &b);
gr[a].emplace_back(b);
gri[b].emplace_back(a);
}
for(int i = 1; i <= n; ++i) {
if(!viz[i]) dfs(i);
}
reverse(order.begin(), order.end());
for(int i = 0; i < n; ++i) {
if(viz[order[i]]) {
++cnt;
dfs1(order[i]);
}
}
printf("%d\n", cnt);
for(int i = 1; i <= cnt; ++i) {
for(auto &x : sol[i]) {
printf("%d ", x);
}
printf("\n");
}
}