Pagini recente » Cod sursa (job #2951244) | Cod sursa (job #741118) | Cod sursa (job #2970514) | Cod sursa (job #2079355) | Cod sursa (job #277628)
Cod sursa(job #277628)
#include <stdio.h>
#define MAXM 200000
#define MAXN 100000
struct wtf
{ int a,b; };
wtf A[MAXM+5];
int a[MAXN+5];
int b[MAXN+5];
int *v[MAXN+5];
int s[MAXM+5];
int e[MAXN+5];
int T[MAXN+5];
int *r[MAXN+5];
int m,n; int I=1,t=1,E=1,R=0;
void getstuff()
{
int i=0;
scanf("%d%d",&n,&m);
for (i=0; i<m; ++i)
{
scanf("%d%d",&A[i].a,&A[i].b);
T[ A[i].a ]++;
}
for (i=1; i<=n; ++i)
{
v[i]=new int [ T[i]+2 ]; v[i][0]=0;
a[i]=-1; b[i]=-1; e[i]=0;
}
for (i=0; i<m; ++i)
v[ A[i].a ][ ++v[A[i].a][0] ] = A[i].b;
}
inline int min(int a, int b)
{ if (a>b) return b; return a; }
void taran(int p) //as in pesant
{
int i;
a[p]=I; b[p]=I; I++;
s[E++]=p; e[p]=1;
for (i=1; i<=T[p]; ++i)
if (a[ v[p][i] ] == -1 || e[ v[p][i] ]==1)
{
if (a[ v[p][i] ] == -1)
taran( v[p][i] );
b[ p ] = min ( b[ v[p][i] ] , b[p] );
}
if (a[p] == b[p])
{
t=E;
while (s[t]!=p)
--t;
r[R]=new int [E-t+3]; r[R][0]=0;
while (s[E]!=p)
{
s[E]=0;
--E;
r[R][ ++r[R][0] ] = s[E];
}
s[E]=0;
++R;
}
}
void dostuff()
{
int i=0; E=1;
for (i=1; i<=n; ++i)
if (a[i]==-1) taran(i);
--E;
while (s[E]!=0)
{
r[R]=new int [3];
r[R][1]=s[E]; r[R][0]=1; s[E]=0; --E; ++R;
}
}
void printstuff()
{
int i,j;
printf("%d\n",R);
for (i=0; i<R; ++i)
{
for (j=1; j<=r[i][0]; ++j)
printf("%d ",r[i][j]);
printf("\n");
}
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
getstuff();
dostuff();
printstuff();
fclose(stdin);
fclose(stdout);
return 0;
}