Pagini recente » Cod sursa (job #1309660) | Cod sursa (job #463056) | Cod sursa (job #1385214) | Cod sursa (job #2394850) | Cod sursa (job #304060)
Cod sursa(job #304060)
#include <stdio.h>
#define maxn 100004
#define maxm 500004
FILE *in=fopen("ciclueuler.in","r"),*out=fopen("ciclueuler.out","w");
int n,m;
struct graf{
int info;
graf *adr_urm;
};
graf *a[maxn];
int g[maxn];
void adauga(graf *&v,int x){
graf *p=new graf;
p->info=x;
p->adr_urm=v;
v=p;
}
int citire(){
int x,y,i;
fscanf(in,"%d%d",&n,&m);
while(m--){
fscanf(in,"%d%d",&x,&y);
adauga(a[x],y);g[x]++;
adauga(a[y],x);g[y]++;
}
for(i=1;i<=n;i++)if(g[i]%2)return 1;
return 0;
}
void elimin(int x,int y){
// elimin x,y;
graf *q;
q=a[x];
a[x]=a[x]->adr_urm;
delete(q);
//y x
graf *p,*r;
if(a[y]->info==x){
p=a[y];
a[y]=a[y]->adr_urm;
delete(p);
}
else{
for(r=a[y];r->adr_urm;r=r->adr_urm)
if(r->adr_urm->info==x){
p=r->adr_urm;
r->adr_urm=r->adr_urm->adr_urm;
delete(p);
break;
}
}
}
void euler(){
int nod=0,k=0,vf=0;
int s[maxm],sol[maxm];
s[++vf]=1;
while(vf){
nod=s[vf];
// printf("(%d)",nod);
if(a[nod]!=NULL){
// printf("(%d)",nod);
s[++vf] =a[nod]->info;
elimin(nod,a[nod]->info);
}
else { // printf("(*%d*)",nod);
sol[++k]=s[vf--];}
}
for(int i=1;i<k;i++)fprintf(out,"%d ",sol[i]);
}
int main(){
if(citire()) fprintf(out,"-1\n");
else
euler();
fclose(in);
fclose(out);
}