Cod sursa(job #295821)

Utilizator otilia_sOtilia Stretcu otilia_s Data 3 aprilie 2009 18:17:44
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#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;
}