Pagini recente » Istoria paginii runda/abc | Cod sursa (job #2904704) | Cod sursa (job #761144) | Cod sursa (job #1033803) | Cod sursa (job #1262489)
#include <cstdio>
FILE*f=fopen("ctc.in","r");
FILE*h=fopen("ctc.out","w");
struct lista{
int urm,val;
};
lista graf[200001],invg[200001],rez[100001];
int n,m,st[100001],lst[100001],cap,nr,invl[100001],invc,varf[100001],comp;
bool pas[100001];
void dfs(int x){
if ( pas[x]==1 )return;
pas[x]=1;
int it=lst[x];
while ( it!=0 ){
dfs(graf[it].val);
it=graf[it].urm;
}
st[++nr]=x;
}
void dfss(int x){
if ( pas[x]==1 )return;
pas[x]=1;
rez[++nr].val=x;
rez[nr].urm=varf[comp];
varf[comp]=nr;
int it=invl[x];
while ( it!=0 ){
dfss(invg[it].val);
it=invg[it].urm;
}
}
int main(){
fscanf(f,"%d%d",&n,&m);
for ( int i=1;i<=m;++i ){
int x,y;
fscanf(f,"%d%d",&x,&y);
graf[++cap].val=y;
graf[cap].urm=lst[x];
lst[x]=cap;
invg[++invc].val=x;
invg[invc].urm=invl[y];
invl[y]=invc;
}
for ( int i=1;i<=n;++i )
if ( pas[i]==0 )
dfs(i);
for ( int i=1;i<=n;++i )
pas[i]=0;
nr=0;
for ( int i=n;i>=1;--i )
if ( pas[st[i]]==0 ){
++comp;
dfss(st[i]);
}
fprintf(h,"%d\n",comp);
for ( int i=1;i<=comp;++i ){
int it=varf[i];
while ( it!=0 ){
fprintf(h,"%d ",rez[it].val);
it=rez[it].urm;
}
fprintf(h,"\n");
}
return 0;
}