Pagini recente » Cod sursa (job #2317415) | Cod sursa (job #567203) | Cod sursa (job #2567420) | Cod sursa (job #1143922) | Cod sursa (job #238888)
Cod sursa(job #238888)
#include<stdio.h>
#define N 100010
#define M 500010
struct nod { int edge;nod *urm;};
nod *pp,*qq,*prim[N],*ultim[N];
int eulerian,n,m,i,aa,bb,gg[N],dad[N],nc,ga[N],nn,a[M],b[M],tip[M],
bucla=1,arbore=2,eliminat=3,tipp,ee;
void readd(),add_edge(),dfs(int NOD);
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",&a[i],&b[i]);
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;
while(tip[prim[nc]->edge]==eliminat)prim[nc]=prim[nc]->urm;
if(gg[nc]>ga[nc])
{ for(;;)
{ tipp=tip[prim[nc]->edge];
if(tipp==eliminat)
{ prim[nc]=prim[nc]->urm;
continue;
}
if(tipp==arbore)
{ ultim[nc]->urm=prim[nc];
prim[nc]=prim[nc]->urm;
ultim[nc]=ultim[nc]->urm;
ultim[nc]->urm=0;
continue;
}
break;
}
ee=prim[nc]->edge;
tip[ee]=eliminat;
printf("%d ",nc);
if(tipp==bucla){gg[nc]-=2;continue;}
gg[nc]--;
nc=a[ee]+b[ee]-nc;
gg[nc]--;
continue;
}
printf("%d ",nc);
while(tip[prim[nc]->edge]==eliminat)prim[nc]=prim[nc]->urm;
gg[nc]--;ga[nc]--;
ee=prim[nc]->edge;
tip[ee]=eliminat;
nc=a[ee]+b[ee]-nc;
gg[nc]--;ga[nc]--;
}
}
void add_edge()
{ if(a[i]==b[i])
{ gg[a[i]]+=2;
pp=new nod;
pp->edge=i;
pp->urm=0;
if(!prim[a[i]])prim[a[i]]=ultim[a[i]]=pp;
else {ultim[a[i]]->urm=pp;ultim[a[i]]=pp;}
tip[i]=bucla;
return;
}
gg[a[i]]++;gg[b[i]]++;
pp=new nod;
pp->edge=i;pp->urm=0;
if(!prim[a[i]])prim[a[i]]=ultim[a[i]]=pp;
else {ultim[a[i]]->urm=pp;ultim[a[i]]=pp;}
pp=new nod;
pp->edge=i;pp->urm=0;
if(!prim[b[i]])prim[b[i]]=ultim[b[i]]=pp;
else {ultim[b[i]]->urm=pp;ultim[b[i]]=pp;}
}
void dfs(int tt)
{ nod *paux;int ff;
for(paux=prim[tt];paux;paux=paux->urm)
{ ee=paux->edge;
ff=a[ee]+b[ee]-tt;
if(ff>1&&!dad[ff])
{ dad[ff]=tt;
ga[ff]++;ga[tt]++;
tip[ee]=arbore;
dfs(ff);
}
}
}