Cod sursa(job #2812992)

Utilizator lucamLuca Mazilescu lucam Data 5 decembrie 2021 16:32:45
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

std::ifstream in("ciclueuler.in");
std::ofstream out("ciclueuler.out");

const int N = 1e5 + 1, M = 5e5 + 1;

int n, m;
struct Graph {
	std::pair<int, int> edges[M];
	std::bitset<M> deleted;
	int first_available[N];
	std::vector<int> nodes[N];
	void add_edge(int u, int v) {
		static int edge_idx;
		edges[++edge_idx] = {u, v};
		nodes[u].push_back(edge_idx);
		nodes[v].push_back(edge_idx);
	}
	bool all_ranks_even() {
		return std::all_of(nodes + 1, nodes + n + 1, [&](std::vector<int> &eu) {
			return eu.size() % 2 == 0;
		});
	}
	int pop_edge(int u) {
		for (int i = first_available[u]; i < int(nodes[u].size()); ++i) {
			int e = nodes[u][i];
			if (!deleted[e]) {
				first_available[u] = i + 1;
				deleted[e] = true;
				return e;
			}
		}
		return -1;
	}
	void build_euler_cycle(std::vector<int> &out) {
		std::stack<int> st;
		st.push(1);
		while (!st.empty()) {
			int u = st.top();
			int e = pop_edge(u);
			if (e == -1) {
				st.pop();
				if (!st.empty()) {
					out.push_back(u);
				}
				continue;
			}
			int v = edges[e].first + edges[e].second - u;
			st.push(v);
		}
	}
} g;

int main() {
	in >> n >> m;
	for (int i = 0; i < m; ++i) {
		int u, v;
		in >> u >> v;
		g.add_edge(u, v);
	}
	if (!g.all_ranks_even()) {
		out << "-1\n";
		return 0;
	}
	std::vector<int> cycle;
	cycle.reserve(m);
	g.build_euler_cycle(cycle);
	if (int(cycle.size()) != m) {
		out << "-1\n";
		return 0;
	}
	for (auto u : cycle) {
		out << u << " ";
	}
	out << "\n";
}