Pagini recente » Cod sursa (job #504292) | Cod sursa (job #784661) | Cod sursa (job #2906631) | Cod sursa (job #2911130) | Cod sursa (job #2142120)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector <int> edge[N];
vector <vector <int>> ans;
stack <int> s;
bool used[N];
int tin[N], low[N];
int fr = 0;
void dfs(int x){
fr++;
tin[x] = fr;
low[x] = fr;
used[x] = true;
s.push(x);
for(auto &it : edge[x]){
if(used[it] == false){
dfs(it);
low[x] = min(low[x], low[it]);
}else{
low[x] = min(low[x], tin[it]);
}
}
if(tin[x] == low[x]){
vector <int> ax;
int y;
do{
y = s.top();
s.pop();
ax.emplace_back(y);
}while(y != x);
ans.emplace_back(ax);
}
}
int main(){
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
int n, m;
scanf("%d %d", &n, &m);
for(int i = 1;i <= m;i++){
int x, y;
scanf("%d %d", &x, &y);
edge[x].push_back(y);
}
for(int i = 1;i <= n;i++){
if(used[i] == false){
dfs(i);
}
}
printf("%d\n", ans.size());
for(auto &vect : ans){
for(auto &it : vect){
printf("%d ", it);
}
printf("\n");
}
return 0;
}