Cod sursa(job #760362)
#include<fstream>
#include<iostream>
#include<list>
#include<queue>
#include<stack>
#define Nmax 100000
#define pb push_back
#define tryNext(C, it) for(typeof(C.begin()) it = C.begin(); it != C.end(); it++)
using namespace std;
list< int > G[Nmax],L;
stack< int > S;
queue< int > Q;
int deg[Nmax],viz[Nmax];
int n,m;
int i,m1;
// citeste
void citeste()
{
int u,v;
scanf("%d %d", &n, &m);
m1 = m;
while( m > 0)
{
scanf("%d %d", &u, &v);
G[u].pb(v); deg[u]++;
G[v].pb(u); deg[v]++;
m--;
}
}
//BFS
void BFS()
{
int v;
Q.push(1);
viz[1] = 1;
while( !Q.empty() )
{
v = Q.front(); Q.pop();
for(list< int >::iterator w = G[v].begin();w != G[v].end();w++)
if( viz[*w] == 0 )
{
Q.push(*w);
viz[*w] = 1;
}
}
}
// verif eulerian
int eulerian()
{
BFS();
for(int i = 1; i<=n;i++)
if( deg[i]%2 != 0 || viz[i] == 0)
return 0;
return 1;
}
//sterge (v,w)
void sterge( int v, int w )
{
deg[v]--; deg[w]--;
G[v].pop_front();
tryNext(G[w],it)
if( *it == v){
G[w].erase(it);
break;
}
}
// ciclu eulerian
void euler( int v )
{
while(true)
{
if(G[v].empty())
break;
int w = G[v].front();
S.push(v);
sterge(v,w);
v = w;
}
}
// uneste cicluri euleriene
int rez()
{
int v = eulerian();
if( v == 0 )
return -1;
do{
euler(v);
v = S.top(); S.pop();
L.push_back(v);
}while( !S.empty() );
return 1;
}
void afis()
{
int i = m1;
if( rez() == -1)
printf("-1\n");
else
{
list< int >::iterator it = L.begin();
while(i--)
{
printf("%d\n",*it);
it++;
}
}
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
citeste();
afis();
return 0;
}