Pagini recente » Cod sursa (job #1780385) | Cod sursa (job #2051612) | Cod sursa (job #2448786) | Cod sursa (job #2962041) | Cod sursa (job #358549)
Cod sursa(job #358549)
#include <cstdio>
#define MaxN 100010
struct nod{
int x;
nod *urm;
};
nod *G[MaxN],*c,*uc,*c1,*uc1;
int N,uz[MaxN],t,d[MaxN];
void add(int x,int y)
{
nod *aux=new nod;
aux->x=y; aux->urm=G[x];
G[x]=aux;
}
void cit()
{
int i,x,y,M;
freopen("ciclueuler.in","r",stdin);
scanf("%d%d",&N,&M);
for(i=1;i<=M;i++)
{
scanf("%d%d",&x,&y);
d[x]++; d[y]++;
add(x,y);
add(y,x);
}
}
void dfs(int Nod)
{
nod *q=new nod;
uz[Nod]=1;
q=G[Nod];
while(q)
{
if(!uz[q->x])
dfs(q->x);
q=q->urm;
}
}
int conex()
{
dfs(1);
for(int i=1;i<=N;i++)
if(!uz[i])
return 0;
return 1;
}
int eulerian()
{
if(!conex())
return 0;
for(int i=1;i<=N;i++)
if(!d[i] || d[i]%2)
return 0;
return 1;
}
void sterge(int x,int Nod)
{
nod *q=new nod,*pred=new nod;
q=G[x];
if(G[x]->x==Nod)
{
if(G[x]->urm)
G[x]=G[x]->urm;
}
else
pred=G[x]; q=G[x]->urm;
while(q)
{
if(q->x==Nod)
{
pred->urm=q->urm;
return;
}
q=q->urm;
pred=pred->urm;
}
}
int adiac(int Nod)
{
int x;
nod *q=new nod;
q=G[Nod];
x=q->x;
sterge(x,Nod);
if(G[Nod]->urm)
G[Nod]=G[Nod]->urm;
return x;
}
void ciclu1(int Nod,nod *c,nod *uc,int sw)
{
int x,pred=Nod;
nod *q;
while(sw)
{
x=adiac(pred);
q=new nod;
q->x=x;
if(sw==1)
c=q, uc=q;
else
uc->urm=q, uc=q, uc->urm=0;
d[x]--; d[pred]--;
if(x==Nod)
return;
pred=x;
sw++;
}
}
void ciclu2(int Nod,int sw)
{
int x,pred=Nod;
nod *q;
while(sw)
{
x=adiac(pred);
q=new nod;
q->x=x;
if(sw==1)
c1=q, uc1=q;
else
uc1->urm=q, uc1=q, uc1->urm=0;
if(x==Nod)
{
d[x]--; d[pred]--;
return;
}
d[x]--; d[pred]--;
pred=x;
sw++;
}
}
int cauta()
{
nod *q=new nod;
q=c;
while(q)
{
if(d[q->x])
return q->x;
q=q->urm;
}
return 0;
}
void concatenare(int Nod)
{
nod *q=new nod,*w;
q=c;
while(q)
{
if(q->x==Nod)
{
w=new nod;
w=q->urm;
q->urm=c1;
uc1->urm=w;
}
q=q->urm;
}
}
int sol()
{
int t=eulerian(),Nod=1;
if(!t)
return 0;
c=new nod; uc=new nod;
nod *q=new nod;
q->x=1; q->urm=0;
c=q; uc=q;
ciclu1(1,c,uc,2);
Nod=cauta();
while(Nod)
{
c1=new nod; uc1=new nod;
ciclu2(Nod,1);
concatenare(Nod);
Nod=cauta();
}
return 1;
}
void afis(int t)
{
freopen("ciclueuler.out","w",stdout);
if(!t)
printf("-1");
else
{
nod *q=new nod;
q=c;
while(q)
{
printf("%d ",q->x);
q=q->urm;
}
}
}
int main()
{
cit();
afis(sol());
return 0;
}