Pagini recente » Cod sursa (job #1746454) | Cod sursa (job #1782555) | Cod sursa (job #79804) | Cod sursa (job #2402338) | Cod sursa (job #295821)
Cod sursa(job #295821)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 100005
int *L[NMAX],*Lt[NMAX],elem[NMAX],c[NMAX],v[NMAX];
int n,nc,nre;
int viz[NMAX];
void citire()
{
FILE *fin=fopen("ctc.in","r");
int m,i;
fscanf(fin,"%d%d",&n,&m);
for (i=1;i<=n;++i)
{ L[i]=(int*)realloc(L[i],sizeof(int)); L[i][0]=0;
Lt[i]=(int*)realloc(Lt[i],sizeof(int)); Lt[i][0]=0;
}
while (m--)
{ int x,y;
fscanf(fin,"%d %d",&x,&y);
L[x][0]++;
L[x]=(int*) realloc(L[x],(L[x][0]+1)*sizeof(int));
L[x][L[x][0]]=y;
Lt[y][0]++;
Lt[y]=(int*)realloc(Lt[y],(Lt[y][0]+1)*sizeof(int));
Lt[y][Lt[y][0]]=x;
}
fclose(fin);
}
void dfs(int x)
{
viz[x]=1;
int i;
for (i=1;i<=L[x][0];++i)
if (!viz[L[x][i]]) dfs(L[x][i]);
v[++nre]=x;
}
void dfs_gt(int x)
{int i;
viz[x]=0; elem[++nre]=x; c[nre]=nc;
for (i=1;i<=Lt[x][0];++i)
if (viz[Lt[x][i]]) dfs_gt(Lt[x][i]);
}
void afisare()
{
FILE *fout=fopen("ctc.out","w");
fprintf(fout,"%d",nc);
c[0]=0;
int i;
for (i=1;i<=n;++i)
{
if (c[i]!=c[i-1]) fprintf(fout,"\n");
fprintf(fout,"%d ",elem[i]);
}
fclose(fout);
}
int main()
{
citire();
memset(viz,0,sizeof(viz));
int i;
nc=0;
for (i=1;i<=n;++i)
if (!viz[i]) dfs(i);
nre=0;
for (i=n;i;--i)
if (viz[v[i]])
{
nc++;
dfs_gt(v[i]);
}
afisare();
return 0;
}