Cod sursa(job #2794619)

Utilizator schizofrenieShallan Davar schizofrenie Data 5 noiembrie 2021 10:52:19
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#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;
}