Cod sursa(job #508272)

Utilizator paul992Cirstean Paul paul992 Data 7 decembrie 2010 22:44:34
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<stdio.h>

int n,m,a[5001][5001],viz[5001],c[5001],nr,f[5001][5001];

void warshall()
{
	for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]==0&&i!=k&&j!=k&&i!=j)
				a[i][j]=a[i][k]*a[k][j];}

void bf(int x)
{int pi,pu;
for(int i=1;i<=n;i++)
	viz[i]=0;
pi=pu=1;
c[pi]=x;
viz[x]=1;
while(pi<=pu)
{x=c[pi];
for(int i=1;i<=n;i++)
	if(a[x][i]==1&&viz[i]==0)
	{viz[i]=1;
	c[++pu]=i;}
pi++;}
int k=0;
for(int i=1;c[i];i++)
f[nr][++k]=c[i];

}


int main()
{freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
int x,y;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{scanf("%d %d",&x,&y);
a[x][y]=1;}
warshall();
for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
		if(a[i][j]!=a[j][i])a[i][j]=a[j][i]=0;
for(int i=1;i<=n;i++)
	if(viz[i]==0)
		{nr++;
		bf(i);}
printf("%d \n",nr);
for(int i=1;i<=nr;i++)
	{for(int j=1;f[i][j]!=0;j++)
		printf("%d ",f[i][j]);
	printf("\n");}

return 0;}