Pagini recente » Cod sursa (job #2792824) | Cod sursa (job #384701) | Cod sursa (job #382290) | Cod sursa (job #1244053) | Cod sursa (job #238864)
Cod sursa(job #238864)
#include<stdio.h>
#define N 100001
struct nod { int inf,mult;nod *urm,*per;};
nod *pp,*qq,*prim[N],*pd;
int eulerian,n,m,i,aa,bb,gg[N],dad[N],nc,ga[N],nn;
void readd(),add_edge(),dfs(int NOD),search();
int main()
{ readd();
if(!eulerian){printf("-1\n");return 0;}
return 0;
}
void readd()
{ freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{ scanf("%d%d",&aa,&bb);
add_edge();
}
for(i=1;i<=n;i++)
if(gg[i]&1){eulerian=0;return;}
dfs(1);
for(i=2;i<=n;i++)
if(!dad[i]){eulerian=0;return;}
eulerian=1;
nc=1;
for(;;)
{ if(!gg[nc])return;
if(gg[nc]>ga[nc])
{ printf("%d ",nc);
search();
nn=pp->inf;
if(nn==nc){pp->mult--;gg[nc]-=2;continue;}
qq=pp->per;
pp->mult--;gg[nc]--;
qq->mult--;gg[nn]--;
nc=nn;
continue;
}
printf("%d ",nc);
while(!prim[nc]->mult)prim[nc]=prim[nc]->urm;
nn=prim[nc]->inf;
prim[nc]->mult--;gg[nc]--;ga[nc]--;
pp=prim[nc]->per;
pp->mult--;gg[nn]--;ga[nn]--;
nc=nn;
}
}
void add_edge()
{ if(aa==bb)
{ gg[aa]+=2;
for(pp=prim[aa];pp;pp=pp->urm)
if(pp->inf==aa)
{ pp->mult++;return;}
pp=new nod;
pp->inf=aa;
pp->mult=1;
pp->urm=prim[aa];
prim[aa]=pp;
return;
}
gg[aa]++;gg[bb]++;
for(pp=prim[aa];pp;pp=pp->urm)
if(pp->inf==bb)break;
if(pp)
{ qq=pp->per;
pp->mult++;
qq->mult++;
return;
}
pp=new nod;
pp->inf=bb;pp->mult=1;pp->urm=prim[aa];prim[aa]=pp;
pp=new nod;
pp->inf=aa;pp->mult=1;pp->urm=prim[bb];prim[bb]=pp;
prim[aa]->per=prim[bb];
prim[bb]->per=prim[aa];
}
void dfs(int NOD)
{ nod *paux;
for(paux=prim[NOD];paux;paux=paux->urm)
if(paux->inf>1&&!dad[paux->inf])
{ dad[paux->inf]=NOD;
ga[NOD]++;
ga[paux->inf]++;
dfs(paux->inf);
}
}
void search()
{ while(!prim[nc]->mult)prim[nc]=prim[nc]->urm;
for(pp=prim[nc];;pp=pp->urm)
{ if(pp->mult==1&&(dad[pp->inf]==nc||dad[nc]==pp->inf))continue;
return;
}
}