Pagini recente » Cod sursa (job #154640) | Profil Moldo97 | Cod sursa (job #1587748) | Cod sursa (job #608963) | Cod sursa (job #2073476)
#include <bits/stdc++.h>
using namespace std;
int cr, Sol, n, m, NR, k;
int id[100005], d[100005], st[100005];
vector <int> v[100005];
vector <int> ctc[100005];
bool f[100005];
inline void dfs(int nod){
f[nod] = 1;
id[nod] = d[nod] = ++k;
st[NR++] = nod;
// if(NR > 100000){
// bool ok = 0;
//
// }
for(auto it : v[nod]){
if(d[it] == 0){
dfs(it);
d[nod] = min(d[it], d[nod]);
}
else if(f[it]) d[nod] = min(d[nod], d[it]);
}
if(d[nod] == id[nod]){
int x = nod;
++Sol;
do{
x = st[--NR];
f[x] = 0;
ctc[Sol].push_back(x);
}while(x != nod);
}
}
int main()
{
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
scanf("%d%d", &n, &m);
int x, y;
for(int i = 1; i <= m ; ++i){
scanf("%d%d", &x, &y);
v[x].push_back(y);
}
for(int i = 1; i <= n ; ++i){
if(d[i]) continue ;
NR = 0; dfs(i);
}
printf("%d\n", Sol);
for(int i = 1; i <= Sol ; ++i){
for(auto it : ctc[i])
printf("%d ", it);
printf("\n");
}
return 0;
}