Pagini recente » Cod sursa (job #1411528) | Cod sursa (job #1726198) | Cod sursa (job #1720648) | Cod sursa (job #825745) | Cod sursa (job #2794397)
#include <cassert>
#include <cstdio>
#include <unordered_set>
#include <list>
#include <iterator>
#define MAXN 100000
#define MAMM 500000
#define ERASE(de, la) do { \
muchii[de].erase(muchii[de].find(la)); \
muchii[la].erase(muchii[la].find(de)); \
} while (false);
std::unordered_multiset<int> muchii[MAXN];
std::list<int> ret;
std::list<int>::iterator
heir (std::list<int>::iterator ins, int vertex) {
int i = vertex;
do {
int de = i;
i = *muchii[de].begin();
ERASE(de, i);
ret.emplace(ins, de + 1);
} while (i != vertex);
return ins;
}
int main () {
size_t n, m;
size_t i;
assert(freopen("ciclueuler.in", "r", stdin));
assert(freopen("ciclueuler.out", "w", stdout));
assert(scanf("%zu%zu", &n, &m) == 2);
for (i = 0; i != m; ++ i) {
int de, la;
assert(scanf("%d%d", &de, &la) == 2);
-- de, -- la;
muchii[de].emplace(la);
muchii[la].emplace(de);
}
for (i = 0; i != n; ++ i) {
if (muchii[i].size() % 2 || muchii[i].size() == 0) {
puts("-1");
return 0;
}
}
heir(ret.end(), 0);
for (auto it = ret.begin(); it != ret.end(); ++ it) {
if (muchii[*it].size())
heir(std::next(it), *it);
}
if (ret.size() == m) {
for (auto i : ret)
printf("%d ", i);
} else {
puts("-1");
}
return 0;
}