Cod sursa(job #277628)

Utilizator znakeuJurba Andrei znakeu Data 11 martie 2009 20:15:23
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#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;
}