Pagini recente » Cod sursa (job #257363) | Cod sursa (job #347541) | Cod sursa (job #137758) | Cod sursa (job #1829423) | Cod sursa (job #238772)
Cod sursa(job #238772)
#include<stdio.h>
#define N 100010
#define M 500010
struct nod { int inf;nod *urm;};
nod *A[N],*B[N];
int ok,n,m,i,aa,bb,C[N],e,a[M],b[M];
char t[M];
int readd();
void euler();
int main()
{ ok=readd();
if(!ok){printf("-1\n");return 0;}
euler();
return 0;
}
int readd()
{ int gr[N],q[N],pr,ul,nc,nv,ec;
nod *v[N],*paux;
freopen("ciclueuler.in","rt",stdin);
freopen("ciclueuler.out","wt",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){ gr[i]=0;v[i]=0;}
for(i=1;i<=m;i++)
{ scanf("%d%d",&aa,&bb);
//separam de la inceput muchiile care cicleaza de cele proprii
if(aa==bb){C[aa]++;continue;}
e++;a[e]=aa;b[e]=bb;t[e]='b';
gr[aa]++;gr[bb]++;
paux=new nod;paux->inf=e;
paux->urm=v[aa];v[aa]=paux;
paux=new nod;paux->inf=e;
paux->urm=v[bb];v[bb]=paux;
}
for(i=1;i<=n;i++){ if(gr[i]&1)return 0;gr[i]=0;}
q[1]=1;gr[1]=1;
pr=ul=1;
while(pr<=ul)
{ nc=q[pr];
for(paux=v[nc];paux;paux=paux->urm)
{ ec=paux->inf;
nv=a[ec]+b[ec]-nc;
if(gr[nv])continue;
gr[nv]=1;q[++ul]=nv;t[ec]='a';
}
pr++;
}
if(ul<n)return 0;
return 1;
}
void euler()
{ nod *paux;
int nc,ec;
for(i=1;i<=e;i++)
{ if(t[e]=='b')
{ paux=new nod;paux->inf=e;
paux->urm=B[a[e]];B[a[e]]=paux;
paux=new nod;paux->inf=e;
paux->urm=B[b[e]];B[b[e]]=paux;
}
else
{ paux=new nod;paux->inf=e;
paux->urm=A[a[e]];A[a[e]]=paux;
paux=new nod;paux->inf=e;
paux->urm=A[b[e]];A[b[e]]=paux;
}
}
nc=1;
for(;;)
{ while(C[nc]){printf("%d ",nc);continue;}
while(B[nc]&&t[B[nc]->inf]=='e')B[nc]=B[nc]->urm;
if(B[nc])
{ ec=B[nc]->inf;B[nc]=B[nc]->urm;
printf("%d ",nc);
t[ec]='e';
nc=a[ec]+b[ec]-nc;
continue;
}
while(A[nc]&&t[A[nc]->inf]=='e')A[nc]=A[nc]->urm;
if(A[nc])
{ ec=A[nc]->inf;A[nc]=A[nc]->urm;
printf("%d ",nc);
t[ec]='e';
nc=a[ec]+b[ec]-nc;
continue;
}
printf("\n");break;
}
}