Cod sursa(job #423993)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 24 martie 2010 15:21:54
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<stdio.h>
long i,n,m,x,y,c1[100000],c2[100000],t1[3][200000],t2[3][200000],fin1[100000],fin2[100000],z,nr1,nr2,nrcomp,ind,q,c[100000],t[3][100000],fin[100000],nr,viz1[100000],viz2[100000],comp[100000];
FILE *f,*g;
void df1(long k)
{ viz1[k]=ind; long p=c1[k];
  while(p) 
   { if(viz1[t1[1][p]]!=ind) df1(t1[1][p]);
     p=t1[2][p];
   }
}
void df2(long k)
{ viz2[k]=ind; long p=c2[k]; 
  if(viz1[k]==viz2[k]&&viz2[k]==ind)  { 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) df2(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; }
   }
  nrcomp=0; 
  for(i=1;i<=n;i++) if(comp[i]==0)
   { ind++; nrcomp++; 
     df1(i); 
	 df2(i); 
   }
  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;
}