Cod sursa(job #271113)

Utilizator P1gl3TGilca Mircea Alexandru P1gl3T Data 4 martie 2009 21:52:56
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>
const int N=100002, M=200002;
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];
	int i;
	for(i=0;i<=u-p;++i)
	{
		c[ctc][i]=q[p+i];
		levmin[q[p+i]]=0;
	}
	--p;
	c[ctc][i]=0;
}

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[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;
}