Pagini recente » Cod sursa (job #2853202) | Cod sursa (job #1052908) | Cod sursa (job #351902) | Cod sursa (job #3233541) | Cod sursa (job #238803)
Cod sursa(job #238803)
#include<stdio.h>
#define N 100001
#define M 500001
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[i]=='b')
{ paux=new nod;paux->inf=i;
paux->urm=B[a[i]];B[a[i]]=paux;
paux=new nod;paux->inf=i;
paux->urm=B[b[i]];B[b[i]]=paux;
}
else
{ paux=new nod;paux->inf=i;
paux->urm=A[a[i]];A[a[i]]=paux;
paux=new nod;paux->inf=i;
paux->urm=A[b[i]];A[b[i]]=paux;
}
}
nc=1;
for(;;)
{ if(C[nc]){printf("%d ",nc);C[nc]--;continue;}
if(B[nc]&&t[B[nc]->inf]=='e'){B[nc]=B[nc]->urm;continue;}
if(A[nc]&&t[A[nc]->inf]=='e'){A[nc]=A[nc]->urm;continue;}
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;
}
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;
}
break;
}
}