Pagini recente » Cod sursa (job #855739) | Cod sursa (job #2576857) | Cod sursa (job #2151065) | Cod sursa (job #1189064) | Cod sursa (job #308827)
Cod sursa(job #308827)
#include<stdio.h>
#define N 100005
int n,m,*a[N],*poz[N],d[N],c[5*N],stvec[5*N],stvf[5*N],x[5*N],y[5*N];
int nr=0,viz[N];
void citire(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
scanf("%d%d",&x[i],&y[i]);
d[x[i]]++;
if(x[i]!=y[i])
d[y[i]]++;
}
fclose(stdin);
}
void aloc(){
int i;
for(i=1;i<=n;++i){
a[i]=new int [1+d[i]];
a[i][0]=0;
poz[i]=new int [1+d[i]];
poz[i][0]=0;
d[i]=0;
}
}
void completez(){
int i;
for(i=1;i<=m;++i){
a[x[i]][++a[x[i]][0]]=y[i];
++d[x[i]];
++d[y[i]];
if(x[i]!=y[i])
{
a[y[i]][++a[y[i]][0]]=x[i];
poz[x[i]][a[x[i]][0]]=a[y[i]][0];
poz[y[i]][a[y[i]][0]]=a[x[i]][0];
}
}
}
/*
void euler(int x){
int i,y;
for(i=1;i<=a[x][0];++i){
y=a[x][i];
if(y==0)
continue;
a[x][i]=0;
if(x!=y)
a[y][poz[x][i]]=0;
euler(y);
}
c[++nr]=x;
}
void afisare()
{
int i,j;
for(i=1;i<=n;++i)
{
printf("%d:\t",i);
for(j=1;j<=a[i][0];++j)
printf("(%d,poz=%d) ",a[i][j],poz[i][j]);
printf("\n");
}
}
*/
void euler(int z)
{
int k=1,t;
stvf[k]=z;
stvec[k]=0;
while(k)
{
z=stvf[k];
if(stvec[k]<a[z][0])
{
t=a[z][++stvec[k]];
if(t==0)
continue;
a[z][stvec[k]]=0;
if(z!=t)
a[t][poz[z][stvec[k]]]=0;
stvf[++k]=t;
stvec[k]=0;
continue;
}
c[++nr]=z;
--k;
}
}
bool ver(){
int i;
for(i=1;i<=n;++i)
if(d[i]%2==1)
return false;
return true;
}
int main(){
int i;
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
citire();
aloc();
completez();
//afisare();
euler(1);
if(!ver())
printf("-1\n");
else
for(i=1;i<=nr;++i)
printf("%d ",c[i]);
fclose(stdin);
fclose(stdout);
return 0;
}