Pagini recente » Cod sursa (job #3209498) | Cod sursa (job #870085) | Cod sursa (job #3196457) | Cod sursa (job #2158622) | Cod sursa (job #729555)
Cod sursa(job #729555)
#include <cstdio>
#include <stack>
#include <vector>
#define NMAX 100050
#define MMAX 500050
using namespace std;
bool viz[NMAX], edge[MMAX];
int deg[NMAX], N, M, K;
stack <int> S;
vector < pair <int, int> > G[NMAX];
bool eulerian ();
void dfs (int), compute (), input (), output ();
int main () {
input ();
output ();
return 0;
}
void compute () {
int nod, fiu, m;
S.push (1);
while (!S.empty ()) {
nod = S.top ();
if (!G[nod].empty ()) {
fiu = G[nod].back ().first; m = G[nod].back ().second;
if (!edge[m]) S.push (fiu), edge[m] = 1;
G[nod].pop_back ();
}
else {
printf ("%d ", S.top ());
S.pop ();
}
}
}
void dfs (int nod) {
viz[nod] = 1;
for (vector < pair <int, int> >::iterator it = G[nod].begin (); it != G[nod].end (); it++)
if (!viz[it -> first]) dfs (it -> first);
}
bool eulerian () {
dfs (1);
for (int i = 1; i <= N; i++)
if (!viz[i] || (deg[i] & 1))
return 0;
return 1;
}
void input () {
freopen ("ciclueuler.in", "r", stdin);
scanf ("%d %d", &N, &M);
int i, x, y;
for (i = 1; i <= M; i++) {
scanf ("%d %d", &x, &y);
G[x].push_back (make_pair (y, i));
G[y].push_back (make_pair (x, i));
deg[x]++, deg[y]++;
}
}
void output () {
freopen ("ciclueuler.out", "w", stdout);
if (!eulerian ()) printf ("-1\n");
else compute ();
}