Pagini recente » Cod sursa (job #2354295) | Cod sursa (job #3280245) | Cod sursa (job #409794) | Cod sursa (job #404044) | Cod sursa (job #472816)
Cod sursa(job #472816)
#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;
}