Pagini recente » Cod sursa (job #3037830) | Cod sursa (job #882669) | Cod sursa (job #1559939) | Cod sursa (job #790889) | Cod sursa (job #3253556)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
int n, m, viz1[100001], viz2[100001], cnt;
vector <int> a[100001], b[100001], ans[100001];
stack <int> stiva;
void dfs1(int nod)
{
viz1[nod] = 1;
for (auto it : a[nod]) {
if (!viz1[it]) {
dfs1(it);
}
}
stiva.push(nod);
}
void dfs2(int nod)
{
viz2[nod] = 1;
for (auto it : b[nod]) {
if (!viz2[it]) {
dfs2(it);
}
}
ans[cnt].push_back(nod);
}
int main()
{
f >> n >> m;
while (m--) {
int x, y;
f >> x >> y;
a[x].push_back(y);
b[y].push_back(x);
}
for (int i = 1; i <= n; ++i) {
if (!viz1[i]) {
dfs1(i);
}
}
while (!stiva.empty()) {
int nod = stiva.top();
stiva.pop();
if (!viz2[nod]) {
cnt++;
dfs2(nod);
}
}
g << cnt << '\n';
for (int i = 1; i <= cnt; ++i) {
for (auto it : ans[i]) {
g << it << ' ';
}
g << '\n';
}
return 0;
}