Pagini recente » Cod sursa (job #507053) | Cod sursa (job #762138) | Cod sursa (job #348674) | Cod sursa (job #777397) | Cod sursa (job #2789425)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
vector<int> nxt[N], prv[N], con[N], top;
bool viz1[N], viz2[N];
int nr_con;
void dfs1(int nod) {
viz1[nod] = true;
for (auto vec : nxt[nod])
if (!viz1[vec])
dfs1(vec);
top.push_back(nod);
}
void dfs2(int nod) {
viz2[nod] = true;
con[nr_con].push_back(nod);
for (auto vec : prv[nod])
if (!viz2[vec])
dfs2(vec);
}
int main() {
ifstream cin("ctc.in");
ofstream cout("ctc.out");
int n, m;
cin >> n >> m;
while (m--) {
int x, y;
cin >> x >> y;
nxt[x].push_back(y);
prv[y].push_back(x);
}
cin.close();
for (int i = 1; i <= n; ++i)
if (!viz1[i])
dfs1(i);
reverse(top.begin(), top.end());
for (auto i : top)
if (!viz2[i]) {
++nr_con;
dfs2(i);
}
cout << nr_con << "\n";
for (int i = 1; i <= nr_con; ++i) {
for (auto j: con[i])
cout << j << " ";
cout << "\n";
}
cout.close();
return 0;
}