Cod sursa(job #883626)
#include<iostream>
#include<fstream>
using namespace std;
unsigned int viz[5000],a[5000][5000],b[5000][5000],st[5000],n,m,vf,nc;
void transpus(){
for(unsigned int i=1;i<=n;i++)
for(unsigned int j=1;j<=n;j++)
if(a[i][j]==1)b[j][i]=1;
}
void df(unsigned int nod){
viz[nod]=1;
for(unsigned int i=1;i<=n;i++)
if(viz[i]==0&&a[nod][i]==1)
df(i);
st[++vf]=nod;
}
void dft(unsigned int nod,unsigned int nc){
viz[nod]=nc;
for(unsigned int i=1;i<=n;i++)
if(viz[i]==0&&b[nod][i]==1)
dft(i,nc);
}
int main(){
fstream f("ctc.in",ios::in);
fstream g("ctc.out",ios::out);
unsigned int i,j;
f>>n>>m;
for(unsigned int k=0;k<m;k++){
f>>i>>j;
a[i][j]=1;
}
f.close();
transpus();
vf=0;
for(i=1;i<=n;i++)viz[i]=0;
for(i=1;i<=n;i++)
if(viz[i]==0)
df(i);
for(i=1;i<=n;i++)viz[i]=0;
while(vf>0){
if(viz[st[vf]])vf--;
else
dft(st[vf--],++nc);
}
g<<nc<<"\n";
for(i=1;i<=nc;i++){
for(j=1;j<=n;j++)
if(viz[j]==i)g<<j<<" ";
g<<"\n";
}
g.close();
return 0;
}