Cod sursa(job #2668024)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 4 noiembrie 2020 12:49:44
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n, m;
multiset<int> edges[100100];
vector<int> euler_cycle;
stack<pair<bool, int>> order;

void generate_euler_cycle() {
	order.push(make_pair(false, 1));
	while (!order.empty()) {
		bool need_to_print;
		int act;
		tie(need_to_print, act) = order.top();
		order.pop();
		
		if (need_to_print) {
			euler_cycle.push_back(act);
			continue;
		}
		
		if (edges[act].empty()) {
			order.push(make_pair(true, act));
			continue;
		}
			
		int to = *edges[act].begin();
		edges[act].erase(edges[act].begin());
		edges[to].erase(edges[to].find(act));
		
		order.push(make_pair(false, act));
		order.push(make_pair(false, to));
	}
}

int main() {
	cin.tie(0);cout.tie(0);
	ios::sync_with_stdio(0);
	fin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int u, v;
		fin >> u >> v;
		edges[u].insert(v);
		edges[v].insert(u);
	}
	
	for (int i = 1; i <= n; i++)
		if (edges[i].size() % 2 == 1) {
			fout << -1;
			return 0;
		}
		
	generate_euler_cycle();
	
	for (int i = euler_cycle.size() - 1; i >= 1; i--)
		fout << euler_cycle[i] << ' ';
	return 0;
}