Cod sursa(job #393432)

Utilizator testerXImari dochia testerXI Data 9 februarie 2010 14:35:03
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream.h>
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int Nmax=100001;
const int Mmax=500001;
struct elem
{   int inf;
    elem *urm;
}*a[Nmax];
long n,m,nr,st[Mmax],b[Mmax],d[Nmax],viz[Nmax];

void add(long x,long y)
{
    elem *p=new elem;
    p->inf =y;
    p->urm=a[x];
   a[x]=p;
}
 
void citire()
{
 long x,y;
 f>>n>>m;
 for(long i=0;i<m;i++)
 {
    f>>x>>y;
    d[x]++;
    d[y]++;
    add(x,y);
   add(y,x);
 }
}
 
void afisare()
{
 for(int i=1;i<nr;i++)
 {
    g<<b[i]<<" ";
 }
}
void df(int x)
{
viz[x]=1;
for(elem *p=a[x];p;p=p->urm)
    if(!viz[p->inf])
        df(p->inf);
}
int grad()
{
 for(int i=1;i<=n;i++)
    if(d[i]%2!=0 || viz[i]==0)
       return 0;
 return 1;
}

void sterge(long x,long y)
{
 elem *p=a[x];
a[x]=a[x]->urm;
 delete p;
 if(a[y]->inf!=x)
 {
    for(p=a[y];p->urm;p=p->urm)
       if(p->urm->inf==x)
       {
           elem *q=p->urm;
          p->urm=p->urm->urm;
            delete q;
           break;
       }
 }
 else
 {
   p=a[y];
     a[y]=a[y]->urm;
    delete p;
 }
}

void stiva1()
{
    long niv=1;
   st[niv]=1;
    while(niv)
    {
       long v=st[niv];
       if(a[v])
       {
          niv++;st[niv]=a[v]->inf;
            sterge(v,a[v]->inf);
             
       }
        else
            b[++nr]=st[niv--];
   }
}
void stiva(long niv,long x)
{
    st[niv]=x;
    if(a[x])
   {
        long y=a[x]->inf;
        sterge(x,y);
       stiva(niv+1,y);
    }
   b[++nr]=st[niv];
}
 
int main()
{
 citire();
 df(1);
 if(grad())
 {
   stiva1();
    afisare();
 }
else
   g<<-1<<'\n';
 g.close();
 return 0;
}