Pagini recente » Cod sursa (job #3147099) | Cod sursa (job #2598420) | Cod sursa (job #2653675) | Cod sursa (job #310821) | Cod sursa (job #508272)
Cod sursa(job #508272)
#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;}