Cod sursa(job #304060)

Utilizator drag0shSandulescu Dragos drag0sh Data 10 aprilie 2009 20:02:10
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>

#define maxn 100004

#define maxm 500004
FILE *in=fopen("ciclueuler.in","r"),*out=fopen("ciclueuler.out","w");

int n,m;

struct graf{
  int info;
  graf *adr_urm;
};

graf *a[maxn];

int g[maxn];
void adauga(graf *&v,int x){
  graf *p=new graf;
  p->info=x;
  p->adr_urm=v;
  v=p;
}

int citire(){
  int x,y,i;
  fscanf(in,"%d%d",&n,&m);
  while(m--){
    fscanf(in,"%d%d",&x,&y);
    adauga(a[x],y);g[x]++;
    adauga(a[y],x);g[y]++;
  }
  for(i=1;i<=n;i++)if(g[i]%2)return 1;
  return 0;
}

void elimin(int x,int y){
  //  elimin x,y;
  graf *q;
  q=a[x];
  a[x]=a[x]->adr_urm;
  delete(q);
  //y x
  graf *p,*r;
  if(a[y]->info==x){
    p=a[y];
    a[y]=a[y]->adr_urm;
    delete(p);
  }
  else{
    for(r=a[y];r->adr_urm;r=r->adr_urm)
    if(r->adr_urm->info==x){
      p=r->adr_urm;
      r->adr_urm=r->adr_urm->adr_urm;
      delete(p);
      break;
    }
}
}


void euler(){
  int nod=0,k=0,vf=0;
  int s[maxm],sol[maxm];
  s[++vf]=1;
  while(vf){
    nod=s[vf];
    //    printf("(%d)",nod);
    if(a[nod]!=NULL){
      //  printf("(%d)",nod);
      s[++vf] =a[nod]->info;
      elimin(nod,a[nod]->info);
    }
    else {   //   printf("(*%d*)",nod);
sol[++k]=s[vf--];}
  }
  for(int i=1;i<k;i++)fprintf(out,"%d ",sol[i]);
}

int main(){
  if(citire()) fprintf(out,"-1\n");
  else 
    euler();
  
		 
  
  fclose(in);
  fclose(out);
}