Pagini recente » Cod sursa (job #3133560) | Cod sursa (job #2498058) | Cod sursa (job #2478724) | Cod sursa (job #888644) | Cod sursa (job #534563)
Cod sursa(job #534563)
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <stdio.h>
#define TR(C, it)\
for(typeof(C.begin()) it = C.begin(); it != C.end(); it++)
#define pb push_back
using namespace std;
const int nmax = 100010;
int N, M;
int deg[nmax];
list <int> G[nmax];
void read()
{
int i, x, y;
scanf("%d %d",&N,&M);
for(i = 1; i <= M; i++)
{
scanf("%d %d",&x,&y);
deg[x]++;deg[y]++;
G[x].pb(y);
G[y].pb(x);
}
}
int viz[nmax];
queue <int> Q;
int BFS()
{
queue <int> Q;
int cate = N - 1, x;
Q.push(1);
viz[1] = 1;
while(!Q.empty())
{
x = Q.front();
Q.pop();
TR(G[x], i)
if(!viz[*i])
{
Q.push(*i);
viz[*i] = 1;
cate--;
}
}
return (!cate);
}
int conex()
{
int i;
for(i = 1; i <= N; i++)
if(deg[i] & 1)
return 0;
return BFS();
}
stack <int> S;
void sterge(int v, int w)
{
deg[v]--, deg[w]--;
G[v].pop_front();
TR(G[w], it)
if(*it == v)
{
G[w].erase(it);
return;
}
}
void baga(int v)
{
while(!G[v].empty())
{
int w = G[v].front();
S.push(v);
sterge(v, w);
v = w;
}
}
list<int> F;
void euler()
{
int v = 1;
do
{
baga(v);
v = S.top();
S.pop();
F.pb(v);
} while(!S.empty());
}
int main()
{
freopen ("ciclueuler.in","r",stdin);
freopen ("ciclueuler.out","w",stdout);
read();
if(conex())
{
euler();
TR(F, i)
printf("%d ",*i);
}
else printf("-1");
printf("\n");
return 0;
}