Cod sursa(job #295576)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NMAX 100005
int n,*L[NMAX],S[NMAX],ns,nl,C[NMAX],Q[NMAX],grad[NMAX];
bool viz[NMAX];
void citire()
{
FILE *fin=fopen("ciclueuler.in","r");
int m,i;
fscanf(fin,"%d %d",&n,&m);
for (i=1;i<=n;++i)
{ L[i]=(int*)realloc(L[i],sizeof(int)); L[i][0]=0; grad[i]=0;}
while (m--)
{ int x,y;
fscanf(fin,"%d %d",&x,&y);
++L[x][0]; ++grad[x];
L[x]=(int*)realloc(L[x],(L[x][0]+1)*sizeof(int));
L[x][L[x][0]]=y;
++L[y][0]; ++grad[y];
L[y]=(int*)realloc(L[y],(L[y][0]+1)*sizeof(int));
L[y][L[y][0]]=x;
}
fclose(fin);
}
int eulerian()
{
int i;
for (i=1;i<=n;++i)
if (L[i][0]%2) return 0;
int x,p,u;
memset(viz,0,sizeof(viz));
p=u=0; Q[0]=1; viz[1]=1;
while (p<=u)
{
x=Q[p++];
for (i=1;i<=L[x][0];++i)
if (!viz[L[x][i]]) {
viz[L[x][i]]=1; Q[++u]=L[x][i];
}
}
if (u<n-1) return 0;
return 1;
}
void sterge(int v, int w)
{
int x;
x=L[v][w]; grad[v]--; grad[x]--;
L[v][w]=0;
for (w=1;w<=L[x][0];++w)
if (L[x][w]==v) {L[x][w]=0; break;}
}
void euler(int v)
{
while (grad[v])
{
int x=1,w;
while (L[v][x]==0) ++x;
w=L[v][x];
S[++ns]=v;
sterge(v,x);
v=w;
}
}
int ver()
{
int v=eulerian();
if (!v) return 0;
ns=nl=0;
do
{
euler(v);
v=S[ns--];
C[++nl]=v;
}
while (ns);
return 1;
}
void afisare(int sol)
{
FILE *fout=fopen("ciclueuler.out","w");
if (!sol) fprintf(fout,"-1\n");
else { int i;
for (i=nl;i;--i)
fprintf(fout,"%d ",C[i]);
}
fclose(fout);
}
int main()
{
citire();
afisare(ver());
return 0;
}