Pagini recente » Istoria paginii runda/porc3 | Cod sursa (job #2336262) | Cod sursa (job #2755969) | Autentificare | Cod sursa (job #2794619)
#include <cassert>
#include <cstdio>
#include <unordered_set>
#include <list>
#include <iterator>
#pragma GCC optimize ("O3")
#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) {
//fprintf(stderr, "Starting a cicle from %d\n", vertex + 1);
int i = vertex;
do {
int de = i;
i = *muchii[de].begin();
//fprintf(stderr, "Deleting the edge between %d and %d\n", de + 1, i + 1);
ERASE(de, i);
ret.emplace(ins, i);
//fprintf(stderr, "Adding %d to tour\n", i + 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)
for (auto la : muchii[i]) {
//fprintf(stderr, "%zu %d\n", i + 1, la + 1);
}
for (i = 0; i != n; ++ i) {
if (muchii[i].size() % 2) {
puts("-1");
return 0;
}
}
for (i = 0; muchii[i].size() == 0; ++ i);
ret.emplace_front(i);
for (auto it = ret.begin(); it != ret.end();) {
if (muchii[*it].size())
heir(std::next(it), *it);
if (muchii[*it].size() == 0)
++ it;
}
ret.pop_back();
for (int a : ret) {
//fprintf(stderr, "%d ", a);
} //putc('\n', stderr);
if (ret.size() == m) {
for (auto i : ret)
printf("%d ", i + 1);
} else {
puts("-1");
}
return 0;
}