Pagini recente » Cod sursa (job #2070291) | Cod sursa (job #290312) | Cod sursa (job #2640016) | Cod sursa (job #433310) | Cod sursa (job #423993)
Cod sursa(job #423993)
#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;
}