Cod sursa(job #272155)

Utilizator StigmaSimina Pitur Stigma Data 6 martie 2009 15:06:16
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream.h>
#define nmax (10005)
#define mmax (50005)

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct lista {long nod; lista *urm;};

long n,m,nr;
char sw;
char v[nmax];
lista *eul, *a[mmax];



void df(long k)
{long i;
lista *p;

v[k]=1;
nr++;

 for (p=a[k];p;p=p->urm)
  if (!v[p->nod])
       df(p->nod);
}


int conex()
{df(1);
 return nr==n;
}


void sterge(long x, long y)
{lista *p,*t;

t=0;

for (p=a[x]; p && p->nod!=y; p=p->urm)
t=p;

if (t)
t->urm=p->urm;
else
a[x]=a[x]->urm;

}


void ciclu(lista *e)
{long i,k;
lista *p,*d;
k=e->nod;

 for (;a[k];a[k]=a[k]->urm)
  { i=a[k]->nod;

    sterge(i,k);
    sterge(k,i);

    d=new lista;
    d->nod=i;
    d->urm=e->urm;
    e->urm=d;
    e=e->urm;

    ciclu(e);
    }

}






void rezolva()
{lista *E,*D;

 eul=new lista;

 eul->nod=1;
 eul->urm=0;

 for (E=eul;E;E=E->urm)
    ciclu(E);

 while (eul)
 {fout<<eul->nod<<" ";
  eul=eul->urm;
  }
}



void add(long x, long y)
{lista *p;

p=new lista;
p->nod=y;

p->urm=a[x];
a[x]=p;
}




int main()
{long i,x,y;


fin>>n>>m;
for (i=1;i<=m;i++)
 {fin>>x>>y;
  add(x,y);
  v[x]++;
  v[y]++;

  if(x!=y)
  add(y,x);


  }

for (i=1;i<=n && !sw;i++)
 if (v[i]%2==1) sw=1;

memset(v,0,sizeof(v));

if (!sw && conex())
 rezolva();
 else fout<<"-1";


fout.close();
return 0;
}