Pagini recente » Cod sursa (job #612579) | Cod sursa (job #809860) | Cod sursa (job #2437777) | Cod sursa (job #811509) | Cod sursa (job #2430292)
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5;
#define pb push_back
vector <int> gr[1 + MAX_N], invgr[1 + MAX_N];
vector <int> ord;
vector <int> comp[1 + MAX_N];
bool viz[1 + MAX_N];
int nr;
void dfs1 (int node) {
ord.pb (node);
viz[node] = 1;
for (int &vec : gr[node])
if (!viz[vec])
dfs1 (vec);
}
void dfs2 (int node) {
comp[nr].pb (node);
viz[node] = 0;
for (int &vec : invgr[node])
if (viz[vec])
dfs2 (vec);
}
int main() {
freopen ("ctc.in", "r", stdin);
freopen ("ctc.out", "w", stdout);
int n, m;
cin >> n >> m;
while (m--) {
int x, y;
cin >> x >> y;
gr[x].pb (y);
invgr[y].pb (x);
}
for (int i = 1; i <= n; i++)
if (!viz[i])
dfs1 (i);
nr = 0;
for (int &node : ord)
if (viz[node]) {
nr++;
dfs2 (node);
}
cout << nr << "\n";
for (int i = 1; i <= nr; i++) {
for (int &node : comp[i])
cout << node << " ";
cout << "\n";
}
return 0;
}