Pagini recente » Cod sursa (job #390919) | Cod sursa (job #3129488) | Cod sursa (job #1908824) | Cod sursa (job #86639) | Cod sursa (job #2151289)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define Nmax 100000
#define Mmax 500000
using namespace std;
FILE *fin,*fout;
int N,M,sol[Mmax+5],ciclu[Nmax+5],solf=0;
struct nod
{
int info;
nod *urm;
}*v[Nmax+5],*c,*e[Nmax+5];
void del_edge(int x, int y)
{
c=v[y];
nod *gg;
while(c->urm)
{
gg=c;
c=c->urm;
if(c->info==x)
{
gg->urm=c->urm;
break;
}
}
}
void euler(int x,int k)
{
sol[k]=x;
if(k==M)
solf=1;
else
{nod *e=v[x],*del;
int u=0,kaux=ciclu[x]+1;
for(int i=k;i<k+kaux && ciclu[x];i++)
sol[i]=x;
while(e->urm && !solf)
{
del=e;
e=e->urm;
del->urm=e->urm;del_edge(x,e->info);euler(e->info,k+kaux);
}}
}
int main()
{
int x,y;
fin=fopen("ciclueuler.in","r");
fout=fopen("ciclueuler.out","w");
fscanf(fin,"%d %d",&N,&M);
for(int i=1;i<=N;i++)
{
v[i]=new nod;
v[i]->info=i;
v[i]->urm=0;
}
for(int i=1;i<=M;i++)
{
fscanf(fin,"%d %d",&x,&y);
if(x==y)
ciclu[x]++;
else
{if(!v[x]->urm)
{
c=new nod;
c->info=y;
c->urm=0;
v[x]->urm=c;
e[x]=c;
}
else
{
c=new nod;
c->info=y;
c->urm=0;
e[x]->urm=c;
e[x]=c;
}
if(!v[y]->urm)
{
c=new nod;
c->info=x;
c->urm=0;
v[y]->urm=c;
e[y]=c;
}
else
{
c=new nod;
c->info=x;
c->urm=0;
e[y]->urm=c;
e[y]=c;
}}
}
sol[1]=1;
euler(1,1);
for(int i=1;i<M;i++)
fprintf(fout,"%d ",sol[i]);
fprintf(fout,"%d",sol[M]);
return 0;
}