Cod sursa(job #472619)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 25 iulie 2010 21:03:24
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <vector>
#define N 100001
using namespace std;
struct muc
{int m,i;
 bool b;
 
 muc(int x,int y,bool z)
 {m=x;
  i=y;
  b=z;
 }
};
vector<muc> vec[N];

struct nod
{int n;
 nod *urm,*prev;
};
nod *prim,*ultim;

void insereaza(nod* &p,int k)
{nod* q=new nod;
 q->urm=p->urm; p->urm=q;
 q->urm->prev=q;
 q->prev=p;
 q->n=k;
 p=q;
}
typedef vector<muc>::iterator IT;

void euler(int k,nod* p)
{insereaza(p,k);
 for (IT it=vec[k].begin();it!=vec[k].end();it++)
 {if(it->b==true)continue; //muchia a mai fost vizitata
  it->b=true;
  if(it->m!=k)
  {vec[it->m][it->i].b=true;
   euler(it->m,p);
  }
  else
  {insereaza(p,it->m);
  }
 }
}

void init()
{prim=new nod;
 ultim=new nod;
 prim->n=ultim->n=-1;
 prim->urm=ultim;
 ultim->prev=prim;
 prim->prev=NULL;
 ultim->urm=NULL;
}

int main ()
{int n,m,x,y,s1,s2;
 freopen("ciclueuler.in","r",stdin);
 freopen("ciclueuler.out","w",stdout);
 scanf("%d %d",&n,&m);
 for (int i=1;i<=m;i++)
 {scanf("%d %d",&x,&y);
  if(x!=y)
  {s1=vec[x].size();
   s2=vec[y].size();
   vec[x].push_back(muc(y,s2,false));
   vec[y].push_back(muc(x,s1,false));
  }
  else
  {vec[x].push_back(muc(x,s1,false));
  }
 }
 
 init();
 euler(1,prim);
 for (nod *t=prim->urm;t->urm->n!=-1;t=t->urm)
 {printf("%d ",t->n);
 }
 
 return 0;
}