Pagini recente » Cod sursa (job #2445278) | Cod sursa (job #2425133) | Cod sursa (job #462828) | Cod sursa (job #4003) | Cod sursa (job #238744)
Cod sursa(job #238744)
#include<stdio.h>
#define N 100010
int n,m,xx,yy,i,gr[N],*vec[N],pr,ul,nc,vc,q[N],gc,viz[N],nn,grad_max,ic,in;
int main()
{ //Etapa I Alcatuiesc vectorii vecinilor cu alocare dinamica
freopen("ciclueuler.in","rt",stdin);
freopen("ciclueuler.out","wt",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){ scanf("%d%d",&xx,&yy);gr[xx]++;gr[yy]++;}
for(i=1;i<=n;i++)
{ if(gr[i]&1){printf("-1\n");return 0;}
//nod de gr impar => graf neeulerian =>iesire fortata
vec[i]=new int [gr[i]+2];gr[i]=0;
}
freopen("ciclueuler.in","rt",stdin);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{ scanf("%d%d",&xx,&yy);
vec[xx][++gr[xx]]=yy;
vec[yy][++gr[yy]]=xx;
}
//Etapa II Parcurgere in latime
q[1]=1;viz[1]=1;
pr=ul=1;
while(pr<=ul)
{ nc=q[pr];
gc=gr[nc];
for(i=1;i<=gc;i++)
{ vc=vec[nc][i];
if(viz[vc])continue;
viz[vc]=1;
q[++ul]=vc;
}
pr++;
}
if(ul<n){printf("-1\n");return 0;}
//parcurgere incompleta=>graf neconex=>neeulerian=>iesire fortata
//Etapa III
//Graful este eulerian=> construim drumul eulerian
//folosim algoritmul Fleury
nc=1;
for(;m;m--)
{ //tipareste nodul curent
printf("%d ",nc);
//alege un vecin de grad maxim
grad_max=0;nn=0;
for(i=1;i<=gr[nc];i++)
if(gr[vec[nc][i]]>grad_max){ic=i;grad_max=gr[vec[nc][i]];}
nn=vec[nc][ic];
//elimina muchia corespunzatoare
for(i=1;i<=gr[nn];i++)
if(vec[nn][i]==nc){in=i;break;}
vec[nc][ic]=vec[nc][gr[nc]];
vec[nn][in]=vec[nn][gr[nn]];
gr[nc]--;gr[nn]--;
//mergem in noul nod
nc=nn;
}
printf("\n");
return 0;
}