Pagini recente » Cod sursa (job #1844256) | Cod sursa (job #1863476) | Cod sursa (job #1757153) | Cod sursa (job #1680516) | Cod sursa (job #1951362)
#include<bits/stdc++.h>
using namespace std;
const int N=100020;
vector <int> lda[N], ldt[N], l, lc[N];
int v1[N], v2[N], nc;
void dfs1(int nod){
v1[nod]=1;
int x=lda[nod].size();
for(int i=0;i<x;i++) if(!v1[lda[nod][i]]){
dfs1(lda[nod][i]);
}
l.push_back(nod);
}
void dfs(int nod){
int x=ldt[nod].size();
v2[nod]=1;
for(int i=0;i<x;i++) if(!v2[ldt[nod][i]])dfs(ldt[nod][i]);
lc[nc].push_back(nod);
}
int main(){
int n, m;
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
scanf("%d%d", &n, &m);
int x, y;
while(m--){
scanf("%d%d", &x, &y);
lda[x].push_back(y);
ldt[y].push_back(x);
}
for(int i=1;i<=n;i++)if(!v1[i]) dfs1(i);
for(int i=l.size()-1; i>=0;i--) if(!v2[l[i]]){
nc++;
dfs(l[i]);
}
printf("%d\n", nc);
for(int i=1;i<=nc;i++){
int x=lc[i].size();
for(int j=0;j<x;j++) printf("%d ", lc[i][j]);
printf("\n");
}
return 0;
}