Pagini recente » Cod sursa (job #714111) | Cod sursa (job #287261) | Cod sursa (job #1627594) | Cod sursa (job #2660644) | Cod sursa (job #1702200)
#include <fstream>
#include <algorithm>
#include <vector>
#define NMAX 100005
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
int n,m,viz[NMAX],vizT[NMAX],s[NMAX],nr,cmp;
vector<int> G[NMAX],GT[NMAX],ras[NMAX];
void citire(){
cin>>n>>m;
int i,x,y;
for(i=1;i<=m;i++){
cin>>x>>y;
G[x].push_back(y);
GT[y].push_back(x);
}
}
void DFS(int x){
viz[x]=1;
for(int i=0;i<G[x].size();++i)
if(!viz[G[x][i]])
DFS(G[x][i]);
s[++nr]=x;
}
void DFST(int x){
vizT[x]=1;
ras[cmp].push_back(x);
for(int i=0;i<GT[x].size();++i)
if(!vizT[GT[x][i]])
DFST(GT[x][i]);
}
int main(){
citire();
for(int i=1;i<=n;++i)
if(!viz[i])
DFS(i);
for(int i=nr;i>=1;--i){
if(!vizT[s[i]]){
++cmp;
DFST(s[i]);
}
}
cout<<cmp<<'\n';
for(int i=1;i<=cmp;++i){
sort(ras[i].begin(),ras[i].end());
for(int j=0;j<ras[i].size();++j)
cout<<ras[i][j]<<' ';
cout<<'\n';
}
return 0;
}