Cod sursa(job #369370)

Utilizator mihaionlyMihai Jiplea mihaionly Data 28 noiembrie 2009 11:08:02
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
using namespace std;
#define nmax 100001

struct graf
 {
 int x;
 graf *urm;
 };
graf *G[nmax];
int n,m,gr[nmax],nc;
bool viz[nmax];
void add(graf *&nod,int nr)
 {
 graf *p=new graf;
 p->x=nr;
 p->urm=nod;
 nod=p;
 }
int pop(graf *&g)
 {
 int x;
 graf *p=g;
 x=p->x;
 g=g->urm;
 delete p;
 return x;
 }
void del(graf *&g,int x)
 {
 graf *p=g,*pre=NULL;
 while(p)
  {
  if(p->x==x)
   {
   if(pre)
	pre->urm=p->urm;
   else
	g=g->urm;
   delete p;
   return;
   }
  pre=p;
  p=p->urm;
  }
 }
void read()
 {
 freopen("ciclueuler.in","r",stdin);

 scanf("%d %d",&n,&m);
 int x,y;
 for(int i=0;i<m;i++)
  {
  scanf("%d %d",&x ,&y);
  add(G[x],y);
  ++gr[x];
  add(G[y],x);
  ++gr[y];
  }
 }
void dfs(int nod)
 {
 ++nc;
 viz[nod]=true;
 graf *p=G[nod];
 for(;p!=NULL;p=p->urm)
  if(!viz[p->x])
   dfs(p->x);
 }
bool conex()
 {
 dfs(1);
 if(nc==n)
  return true;
 return false;
 }
void euler()
 {
	 freopen("ciclueuler.out","w",stdout);
 int nod=1,y;
 while(G[nod])
  {
  y=pop(G[nod]);
  del(G[y],nod);
  printf("%d ",y);
  nod=y;
  }
 }
bool eulerian()
 {
 int i;
 if(conex())
  for(i=1;i<=n;i++)
   {
   if(gr[i]%2)
	return false;
   }
 else
  return false;
 return true;
 } 
void solve()
 {
 if(!eulerian())
  {
  printf("-1");
  }
 else
  {
  euler();
  }
 }
int main()
 {
 read();
 solve();
 }