Pagini recente » Cod sursa (job #3368908) | Cod sursa (job #3368940) | Cod sursa (job #3368930) | Cod sursa (job #3368922) | Cod sursa (job #3368928)
#include <bits/stdc++.h>
using namespace std;
const string FILENAME = "ctc";
ifstream f(FILENAME + ".in");
ofstream g(FILENAME + ".out");
#define cin f
#define cout g
vector<int> gg[100001];
vector<int> gt[100001];
int vz[100001];
vector<int> ans;
void dfs(int curr) {
vz[curr] = 1;
for(int node : gg[curr]) {
if(!vz[node]) dfs(node);
}
ans.push_back(curr);
}
void dfs_gt1(int curr) {
vz[curr] = 1;
for(int node : gt[curr]) {
if(!vz[node]) dfs_gt1(node);
}
// ans.push_back(curr);
}
void dfs_gt2(int curr) {
cout << curr << ' ';
vz[curr] = 1;
for(int node : gt[curr]) {
if(!vz[node]) dfs_gt2(node);
}
// ans.push_back(curr);
}
int main() {
int n,m;
cin >> n >> m;
for(int i=1;i<=m;++i ) {
int x,y;
cin >> x >> y;
gg[x].push_back(y);
gt[y].push_back(x);
}
for(int i=1;i<=n;++i) {
if(!vz[i]) {
dfs(i);
}
}
for(int i=1;i<=n;++i) vz[i] = 0;
reverse(ans.begin(), ans.end());
int cnt = 0;
for(int x : ans) {
if(!vz[x]) {
cnt++;
dfs_gt1(x);
}
}
for(int i=1;i<=n;++i) vz[i] = 0;
cout << cnt << '\n';
for(int x : ans) {
if(!vz[x]) {
dfs_gt2(x);
cout << '\n';
}
}
return 0;
}