Cod sursa(job #258067)

Utilizator drag0shSandulescu Dragos drag0sh Data 14 februarie 2009 16:42:53
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>

#define MAX 100001
#define MAX2 500001
#define in "ciclueuler.in"
#define out "ciclueuler.out"

FILE *f=fopen(in,"r"),*g=fopen(out,"w");

struct nod{
  int info;
  nod *adr_urm;
}*graf[MAX];


int n,grad[MAX];

void citire();
short int verificare();
void stergere(int,int);
void eulerian();

int main(){
  int i;
  citire();
  for(i=1;i<=n;i++){
    if (graf[i]==NULL)fprintf(g,"NULL");
  }
  if(verificare())fprintf(g,"-1\n");
  else eulerian();

  fclose(f);
  fclose(g);
  return 0;
}
void adaug(nod*& v,int nr){
  nod* c=new nod;
  c->info=nr;
  c->adr_urm=v;
  v=c;
}


void citire(){
  int m,x,y;
  fscanf(f,"%d%d",&n,&m);
  while(m){
    fscanf(f,"%d%d",&x,&y);
    adaug(graf[x],y),grad[x]++;
    adaug(graf[y],x),grad[y]++;
    m--;
  }
}

short int verificare(){
  int  end=n;
  while(end){
    if(grad[end]&1)return 1;
    end--;
  }
  return 0;
}

void eulerian(){
  int stiva[MAX2],sol[MAX2];
  int x,vf,k=0,i;
  vf=1;
  stiva[vf]=1;
  while(vf){
    x=stiva[vf];
    if(graf[x]!=NULL){
      stiva[++vf]=graf[x]->info;
      stergere(x,graf[x]->info);
    }
    else sol[++k]=stiva[vf--];
  }
  for(i=1;i<k;i++)
    fprintf(g,"%d ",sol[i]);
      
    
}

void stergere(int x,int y){
  nod* q,*r,*p;
  q=graf[x];
  graf[x]=graf[x]->adr_urm;
  delete(q);
  if(graf[y]->info==x){
     p=graf[y];
    graf[y]=graf[y]->adr_urm;
    delete(p);
  }
  else
    for(r=graf[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;	
      }
}