Pagini recente » Cod sursa (job #3293423) | Cod sursa (job #3293557) | Cod sursa (job #3241564) | Cod sursa (job #3292722) | Cod sursa (job #235813)
Cod sursa(job #235813)
#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;
}