Pagini recente » Cod sursa (job #3188060) | Cod sursa (job #747887) | Cod sursa (job #2809765) | Cod sursa (job #850794) | Cod sursa (job #559308)
Cod sursa(job #559308)
#include <cstdio>
#include <list>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
#define Nmax 100010
int n, m, rad;
int Gr[Nmax];
list <int> V[Nmax], S;
void citire () {
int i, x, y;
scanf ("%d %d", &n, &m);
for (i = 1; i <= m; i++) {
scanf ("%d %d", &x, &y);
V[x].push_back (y); V[y].push_back (x);
Gr[x]++; Gr[y]++;
}
}
void sterge (int nod, int fiu) {
for (list <int>::iterator it = V[nod].begin (); it != V[nod].end (); it++)
if (*it == fiu) {
V[nod].erase (it);
return ;
}
Gr[nod]--;
}
void ciclu () {
int nod = 0, x;
list <int>::iterator it, it2;
S.push_back (1);
for (it = S.begin (); it != S.end (); it++) {
while (Gr[*it]) {
nod = rad = *it; it2 = it; ++it;
do {
x = V[nod].front ();
V[nod].pop_front ();
sterge (x, nod);
Gr[nod]--; Gr[x]--;
nod = x;
S.insert (it, nod);
} while (rad != nod);
it = it2;
}
}
for (it2 = it = S.begin (), ++it2; it2 != S.end (); it++, it2++)
printf ("%d ", *it);
}
int euler () {
int Q[Nmax], viz[Nmax], p, u, nod, i;
p = u = 1; Q[1] = 1;
memset (viz, 0, sizeof (viz));
while (p <= u) {
nod = Q[p];
for (list <int>::iterator it = V[nod].begin (); it != V[nod].end (); it++)
if (!viz[*it]) {
viz[*it] = 1;
Q[++u] = *it;
}
p++;
}
for (i = 1; i <= n; i++)
if (!viz[i] || Gr[i] % 2 == 1) return 0;
return 1;
}
int main () {
freopen ("ciclueuler.in", "r", stdin);
freopen ("ciclueuler.out", "w", stdout);
citire ();
if (!euler ()) {
printf ("-1\n");
return 0;
}
ciclu ();
return 0;
}