Cod sursa(job #235813)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 25 decembrie 2008 22:04:06
Problema Componente tare conexe Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.78 kb
#include<stdio.h>
#define N 100001
struct nod{int inf;nod *urm;};
nod *paux,*vd[N],*vi[N],*C[N];
int n,m,i,a,b,ctc[N],lhd,hd[N],lhi,hi[N],nc,coada[N],pp,uu,
vizd[N],vizi[N],ic,is,aux;
int main()
{
	freopen("ctc.in","rt",stdin);
	freopen("ctc.out","wt",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{ scanf("%d%d",&a,&b);
	  paux=new nod;
	  paux->inf=b;
	  paux->urm=(vd[a])?vd[a]:0;
	  vd[a]=paux;
	  paux=new nod;
	  paux->inf=a;
	  paux->urm=(vi[b])?vi[b]:0;
	  vi[b]=paux;
	}
	for(i=1;i<=n;i++)
	 if(!ctc[i])
	  { nc++;ctc[i]=i;
	    lhd=1;hd[1]=i;
	    coada[1]=i;pp=uu=1;vizd[i]=1;
	    while(pp<=uu)
	    { for(paux=vd[coada[pp]];paux;paux=paux->urm)
	       if(!vizd[paux->inf])
	       { vizd[paux->inf]=1;
		 lhd++;hd[lhd]=paux->inf;
		 ic=lhd;
		 while(ic>>1&&hd[ic]<hd[ic>>1])
		 { aux=hd[ic];hd[ic]=hd[ic>>1];hd[ic>>1]=aux;ic>>=1;}
		 coada[++uu]=paux->inf;
	       }
	      pp++;
	    }
	    lhi=1;hi[1]=i;
	    coada[1]=i;pp=uu=1;vizi[i]=1;
	    while(pp<=uu)
	    { for(paux=vi[coada[pp]];paux;paux=paux->urm)
	       if(!vizi[paux->inf])
	       { vizi[paux->inf]=1;
		 lhi++;hi[lhi]=paux->inf;
		 ic=lhi;
		 while(ic>>1&&hi[ic]<hi[ic>>1])
		 { aux=hi[ic];hi[ic]=hi[ic>>1];hi[ic>>1]=aux;ic>>=1;}
		 coada[++uu]=paux->inf;
	       }
	       pp++;
	    }
	    while(lhi||lhd)
	    { if(!lhd)
	      { for(;lhi;lhi--)vizi[hi[lhi]]=0;continue;}
	      if(!lhi)
	      { for(;lhd;lhd--)vizd[hd[lhd]]=0;continue;}
	      if(hi[1]<hd[1])
	      { vizi[hi[1]]=0;
		hi[1]=hi[lhi];lhi--;
		ic=1;
		for(;;)
		{ is=ic<<1;
		  if(is>lhi)break;
		  if(is<lhi&&hi[is+1]<hi[is])is++;
		  if(hi[ic]<hi[is])break;
		  aux=hi[ic];hi[ic]=hi[is];hi[is]=aux;
		  ic=is;
		}
		continue;
	      }
	      if(hd[1]<hi[1])
	      { vizd[hd[1]]=0;
		hd[1]=hd[lhd];lhd--;
		ic=1;
		for(;;)
		{ is=ic<<1;
		  if(is>lhd)break;
		  if(is<lhd&&hd[is+1]<hd[is])is++;
		  if(hd[ic]<hd[is])break;
		  aux=hd[ic];hd[ic]=hd[is];hd[is]=aux;
		  ic=is;
		}
		continue;
	      }
	      ctc[hd[1]]=i;
	      paux=new nod;
	      paux->inf=hd[1];
	      paux->urm=(C[i])?C[i]:0;
	      C[i]=paux;
	      vizi[hi[1]]=0;
	      hi[1]=hi[lhi];lhi--;
	      ic=1;
	      for(;;)
	      { is=ic<<1;
		if(is>lhi)break;
		if(is<lhi&&hi[is+1]<hi[is])is++;
		if(hi[ic]<hi[is])break;
		aux=hi[ic];hi[ic]=hi[is];hi[is]=aux;
		ic=is;
	      }
	      vizd[hd[1]]=0;
	      hd[1]=hd[lhd];lhd--;
	      ic=1;
	      for(;;)
	      { is=ic<<1;
		if(is>lhd)break;
		if(is<lhd&&hd[is+1]<hd[is])is++;
		if(hd[ic]<hd[is])break;
		aux=hd[ic];hd[ic]=hd[is];hd[is]=aux;
		ic=is;
	      }
	    }
	  }
	printf("%d",nc);
	for(i=1;i<=n;i++)
	 if(C[i])
	 { printf("\n");
	   for(paux=C[i];paux;paux=paux->urm)
	    printf("%d ",paux->inf);
	 }
	printf("\n");
	return 0;
}