Cod sursa(job #424313)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 24 martie 2010 19:17:08
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
FILE *f,*g;
long i,n,m,x,y,c1[100900],indm,c2[109000],t1[3][209000],t2[3][209000],fin1[109000],fin2[109000],z,nr1,nr2,nrcomp,ind,q,c[109000],t[3][109000],fin[109000],j,nr,viz1[109000],viz2[1009000],comp[109000],o,vector[109000],viz[109000];
void df(long k)
{ viz1[k]=indm; long p=c1[k]; o++; vector[o]=k;
  while(p) 
   { if(viz1[t1[1][p]]!=indm) df(t1[1][p]);
     p=t1[2][p];
   }
}
void dft(long k)
{ viz2[k]=ind; long p=c2[k]; 
  if(!comp[k]&&viz1[k]==indm)  { comp[k]=1; 
  if(c[nrcomp]==0) { nr++; c[nrcomp]=nr; t[1][nr]=k; fin[nrcomp]=nr; }
  else { nr++; t[2][fin[nrcomp]]=nr; t[1][nr]=k; fin[nrcomp]=nr; }}
  while(p)
   { if(viz2[t2[1][p]]!=ind&&comp[t2[1][p]]==0) dft(t2[1][p]);
     p=t2[2][p]; 
   }
}   

int main()
{ f=fopen("ctc.in","r"); g=fopen("ctc.out","w");
  fscanf(f,"%ld%ld",&n,&m);
  for(i=1;i<=m;i++)
   { fscanf(f,"%ld%ld",&x,&y);
     if(c1[x]==0) { nr1++; c1[x]=nr1; t1[1][nr1]=y; fin1[x]=nr1; }
	 else { nr1++; t1[2][fin1[x]]=nr1; t1[1][nr1]=y; fin1[x]=nr1; }
	 z=x; x=y; y=z;
	 if(c2[x]==0) { nr2++; c2[x]=nr2; t2[1][nr2]=y; fin2[x]=nr2; }
	 else { nr2++; t2[2][fin2[x]]=nr2; t2[1][nr2]=y; fin2[x]=nr2; }
   }
 
  for(i=1;i<=n;i++) if(!viz1[i])
   { o=0; indm++; df(i);
     for(j=1;j<=o;j++) if(!comp[vector[j]]) { nrcomp++; ind++; dft(vector[j]); }
   }
  fprintf(g,"%ld\n",nrcomp);
  for(i=1;i<=nrcomp;i++)
   { q=c[i];
     while(q) { fprintf(g,"%ld ",t[1][q]); q=t[2][q]; }
	 fprintf(g,"\n");
   }	 
  fclose(g);
  return 0;
}