Pagini recente » Cod sursa (job #872673) | Cod sursa (job #495288) | Cod sursa (job #592996) | Cod sursa (job #565003) | Cod sursa (job #258067)
Cod sursa(job #258067)
#include <stdio.h>
#define MAX 100001
#define MAX2 500001
#define in "ciclueuler.in"
#define out "ciclueuler.out"
FILE *f=fopen(in,"r"),*g=fopen(out,"w");
struct nod{
int info;
nod *adr_urm;
}*graf[MAX];
int n,grad[MAX];
void citire();
short int verificare();
void stergere(int,int);
void eulerian();
int main(){
int i;
citire();
for(i=1;i<=n;i++){
if (graf[i]==NULL)fprintf(g,"NULL");
}
if(verificare())fprintf(g,"-1\n");
else eulerian();
fclose(f);
fclose(g);
return 0;
}
void adaug(nod*& v,int nr){
nod* c=new nod;
c->info=nr;
c->adr_urm=v;
v=c;
}
void citire(){
int m,x,y;
fscanf(f,"%d%d",&n,&m);
while(m){
fscanf(f,"%d%d",&x,&y);
adaug(graf[x],y),grad[x]++;
adaug(graf[y],x),grad[y]++;
m--;
}
}
short int verificare(){
int end=n;
while(end){
if(grad[end]&1)return 1;
end--;
}
return 0;
}
void eulerian(){
int stiva[MAX2],sol[MAX2];
int x,vf,k=0,i;
vf=1;
stiva[vf]=1;
while(vf){
x=stiva[vf];
if(graf[x]!=NULL){
stiva[++vf]=graf[x]->info;
stergere(x,graf[x]->info);
}
else sol[++k]=stiva[vf--];
}
for(i=1;i<k;i++)
fprintf(g,"%d ",sol[i]);
}
void stergere(int x,int y){
nod* q,*r,*p;
q=graf[x];
graf[x]=graf[x]->adr_urm;
delete(q);
if(graf[y]->info==x){
p=graf[y];
graf[y]=graf[y]->adr_urm;
delete(p);
}
else
for(r=graf[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;
}
}