Cod sursa(job #278020)

Utilizator razyelxrazyelx razyelx Data 12 martie 2009 01:42:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream.h>
#define N 100001
#define M 500001
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

struct muchii{int info;
	      muchii *urm;} *VF[N]; // lista de adiacenta
int n,m,GR[N],st[M],sol[M];

void adauga(muchii *&prim, int y){
     muchii *p;
     p = new muchii;
     p->info = y;
     p->urm  = prim;
     prim    = p;
}
void citeste(){
     int x,y;
     in>>n>>m;
     while(in>>x>>y){
	  //if(x!=y){
	    adauga(VF[x],y);
	    adauga(VF[y],x);
	  //} else adauga(VF[x],y);
	  // creste gradele nodurilor;
	  GR[x]++;
	  GR[y]++;
     }
}
int verifica(){
    for(int i=1;i<=n;++i)
       if(GR[i] % 2 == 1)return 0;
    return 1;
}
 void elimina(int x, int y)  //elimin muchia x,y
  {
  // sterg prim[x]
  muchii *q;
  q=VF[x];
  VF[x]=VF[x]->urm;
  delete(q);

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

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

    if(r->urm->info == x)
     {
     p=r->urm;
     r->urm = r->urm->urm;
     delete(p);
     break;
     }
  }/*
void elimina(int x,int y){
     muchii *p,*q,*r;

     p = VF[x];
     VF[x] = VF[x]->urm;
     delete(p); // sterge y din lista lui x

     for(r= VF[y];r;r=r->urm)
	if(r->info == x){
	   q = r;
	   r = r->urm;

	   delete(q); //sterge x din y

	   break;
	}
}
*/

void parcurge(){
     int vf = 1,k=0;
     st[vf] = 1;
     while(vf){

	  if(VF[st[vf]] != NULL){
	    st[vf+1] = VF[st[vf]]->info;
	    vf++;
	    elimina(st[vf-1],st[vf]);
	  }else{ sol[++k] = st[vf]; vf--;}
     }
     for(int i=1;i<k;++i)
	out<<sol[i]<<" ";
}
void afisare(){
     for(int i=1;i<=n;++i){
	for(muchii *p=VF[i];p;p=p->urm)
	   out<<p->info<<" ";
	out<<"\n";
     }
}
int main(){
    citeste();
    //elimina(1,3);
    //afisare();
    if(verifica())
      parcurge();
    else out<<"-1";

    return 0;
}