Pagini recente » Cod sursa (job #1829104) | Cod sursa (job #1697033) | Cod sursa (job #48787) | Cod sursa (job #2722770) | Cod sursa (job #270698)
Cod sursa(job #270698)
#include<stdio.h>
#include<string.h>
const int N=50002, M=100002;
struct muchie{ int s,d; } m[M];
int *v[N];
int nr[N];
char u[N];
int q[N],p;
int lev=1;
int levmin[N];
int ctc;
int *c[N];
inline void afis(int x)
{
++ctc;
int u=p;
for(;q[p]!=x; --p);
c[ctc]=new int[u-p+2];
memcpy(c[ctc],q+p,(u-p+1)*sizeof(int));
c[ctc][u-p+1]=0;
--p;
}
void tarjan(int x)
{
u[x]=1;
q[++p]=x;
int levc=lev;
levmin[x]=lev;
for(int i=1;i<=nr[x];++i)
{
if(!u[v[x][i]])
{
lev=levc+1;
tarjan(v[x][i]);
if(levmin[v[x][i]]<levmin[x]) levmin[x]=levmin[v[x][i]];
}
if(levmin[v[x][i]] && levmin[v[x][i]]<levmin[x]) levmin[x]=levmin[v[x][i]];
}
if(levc==levmin[x]) afis(x);
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
int n,muchii,i;
scanf("%d%d",&n,&muchii);
for(i=0;i<muchii;++i)
{
scanf("%d%d",&m[i].s,&m[i].d);
++nr[m[i].s];
}
for(i=1;i<=n;++i)
{
v[i]=new int[nr[i]+1];
v[i][0]=0;
}
for(i=0;i<muchii;++i)
v[m[i].s][++v[m[i].s][0]]=m[i].d;
for(i=1;i<=n;++i)
if(!u[i]) tarjan(i);
printf("%d\n",ctc);
for(;ctc;--ctc)
{
for(i=0;c[ctc][i];++i)
printf("%d ",c[ctc][i]);
printf("\n");
}
return 0;
}