Cod sursa(job #243953)

Utilizator FlorianFlorian Marcu Florian Data 14 ianuarie 2009 12:03:58
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
#define Nmax 100001
#define ss 500001
FILE*f=fopen("ciclueuler.in","r");
FILE*g=fopen("ciclueuler.out","w");
int n,m, grad[Nmax];
struct nod
 {
 int info;
 nod *urm;
 };
nod *prim[Nmax];
void insert(int x, int y)
 {
 nod *p,*q;
 grad[x]++; grad[y]++;
 p=new nod;
 p->info=y;
 p->urm=prim[x];
 prim[x]=p;
 q=new nod;
 q->info=x;
 q->urm=prim[y];
 prim[y]=q;
 }
void elim(int x, int y)  //elimin muchia x,y
 {
 // sterg prim[x]
 nod *q;
 q=prim[x];
 prim[x]=prim[x]->urm;
 delete(q);

 nod *p,*r;
 if(prim[y]->info == x)
  {
  p=prim[y];
  prim[y]=prim[y]->urm;
  delete(p);
  }
 else

  for(r=prim[y]; r->urm; r=r->urm)

   if(r->urm->info == x)
    {
    p=r->urm;
    r->urm = r->urm->urm;
    delete(p);
    break;
    }
 }
void euler()
 {
 int x,vf, st[ss], sol[ss],k=0;
 nod *q;
 vf=0;
 st[++vf]=1;
 while(vf)
  {
  x=st[vf];
  if(prim[x]!=NULL)
   {
   st[++vf]=prim[x]->info;
   elim(x, prim[x]->info);
   }
  else  sol[++k]=st[vf--];
  }
 for(int i=1;i<k;++i) fprintf(g,"%d ",sol[i]);

 }
 int check()
  {
  int i;
  for(i=1;i<=n;++i) if(grad[i]%2==1) return 0;
  return 1;
  }
 void read()
  {
  fscanf(f,"%d %d",&n,&m);
  int x,y;
  while(m--)
   {
   fscanf(f,"%d %d",&x,&y);
   insert(x,y);
   }
  }

 int main()
  {
  read();
  if(check()==0) fprintf(g,"-1\n");
  else euler();
  return 0;
  }