Cod sursa(job #472816)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 26 iulie 2010 17:51:09
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <utility>
#define N 100005
using namespace std;
struct muc
{int m;
 int i;
 int b;
 muc(int x,int y)
 {m=x;
  i=y;
  b=0;
 }
};

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;
}
char buf[8192];
int ptr=8192;
int cit()
{int nr=0;
 //sterge spatii
 for(;;ptr++)
 {if(ptr==8192)
  {fread(buf,1,8192,stdin);
   ptr=0;
  }
  if(buf[ptr]>='0'&&buf[ptr]<='9')
  {break;
  }  
 }
 do
 {nr=nr*10+buf[ptr]-'0';
  ptr++;
  if(ptr==8192)
  {fread(buf,1,8192,stdin);
   ptr=0;
  }  
 }
 while(buf[ptr]>='0'&&buf[ptr]<='9');
 return nr;
}

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;
 n=cit();m=cit();
 //scanf("%d %d",&n,&m);

 for (i=1;i<=m;i++)
 {x=cit();y=cit();
 // scanf("%d %d",&x,&y);
  if(x!=y)
  {s1=vec[x].size();
   s2=vec[y].size();
   vec[x].push_back(muc(y,s2));
   vec[y].push_back(muc(x,s1));
  }
  else
  {vec[x].push_back(muc(x,0));
  }
 }

 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) continue;
   vec[k][p].b=1;
   if(vec[k][p].m!=k)
   {vec[vec[k][p].m][vec[k][p].i].b=1;
    st.push(triplet(k,t));
	start[k]=p+1;
	adauga(t,k);
	x=vec[k][p].m;
	y=start[vec[k][p].m]-1;
	k=x;p=y;
   }   
   else
   {adauga(t,vec[k][p].m);
   }
  }
 }
 while(!st.empty());
 for (nod* q=prim->urm;q->n!=-1;q=q->urm)
 {printf("%d ",q->n);	  
 }

 return 0;
}