Cod sursa(job #472730)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 26 iulie 2010 15:12:56
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <utility>
#define N 100001
using namespace std;
struct muc
{int m;
 int i;
 bool b;
 muc(int x,int y,bool z)
 {m=x;
  i=y;
  b=z;
 }
};

vector<muc> vec[N];
int start[N];

struct nod
{int n;
 nod *urm,*prev;
};

struct triplet
{int a;
 nod* c;
 triplet(int x,nod* z)
 {a=x;
  c=z;
 }
};

stack<triplet>st;

void init(nod* &prim,nod* &ultim)
{prim=new nod;
 ultim=new nod;
 prim->urm=ultim;
 ultim->prev=prim;
 
 prim->prev=ultim->urm=NULL;
 prim->n=ultim->n=-1;
}

void adauga(nod* &t,int k)
{nod* q=new nod;
 q->n=k;
 q->urm=t->urm;t->urm=q;
 q->prev=t;
 q->urm->prev=q;
 t=q;
}

int main ()
{freopen("ciclueuler.in","r",stdin);
 freopen("ciclueuler.out","w",stdout);
 int i,k,n,m,x,y,s1,s2,p;
 nod *prim, *ultim, *t;
 memset(start,0,sizeof(start));
 scanf("%d %d",&n,&m);

 for (i=1;i<=m;i++)
 {scanf("%d %d",&x,&y);
  if(x!=y)
  {s1=vec[x].size();
   s2=vec[y].size();
   vec[x].push_back(muc(y,s2,false));
   vec[y].push_back(muc(x,s1,false));
  }
  else
  {vec[x].push_back(muc(x,0,false));
  }
 }
 init(prim,ultim);
 st.push(triplet(1,prim)); 
 do
 {k=st.top().a;
  p=start[k];
  t=st.top().c;
  st.pop();
  
  for (;p<vec[k].size();p++)
  {if(vec[k][p].b==true)continue;
   vec[k][p].b=true;
   if(vec[k][p].m!=k)
   {vec[vec[k][p].m][vec[k][p].i].b=true;
    st.push(triplet(k,t));
	start[k]=p;
	adauga(t,k);
    k=vec[k][p].m;p=start[vec[k][p].m];
   }   
   else
   {adauga(t,vec[k][p].m);
   }
  }
 }
 while(!st.empty());
 for (nod* q=prim;q;q=q->urm)
 {printf("%d ",q->n);	  
 }

 return 0;
}