Cod sursa(job #3214979)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 14 martie 2024 16:43:05
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct edge_t {
	int u, v;
	bool rem;
	edge_t() {}
	edge_t(int u, int v, bool rem): u(u), v(v), rem(rem) {}
	int other(int node) {
		return node ^ u ^ v;
	}
};

vector<edge_t> edges;
vector<vector<int>> adj;
vector<int> cycle;

void euler(int u) {
	while(!adj[u].empty()) {
		int idx = adj[u].back();
		adj[u].pop_back();
		int v = edges[idx].other(u);
		bool &rem = edges[idx].rem;
		if(!rem) {
			rem = 1;
			euler(v);
		}
	}
	cycle.emplace_back(u);
}

int main() {
	int n, m;
	fin >> n >> m;
	adj = vector<vector<int>>(n);
	for(int i = 0; i < m; i++) {
		int u, v;
		fin >> u >> v;
		u--; v--;
		int idx = edges.size();
		edges.emplace_back(u, v, 0);
		adj[u].emplace_back(idx);
		adj[v].emplace_back(idx);
	}
	int u = 0;
	while(u < n && !(adj[u].size() & 1)) {
		u++;
	}
	if(u < n) {
		fout << "-1\n";
		return 0;
	}
	u = 0;
	while(u < n && adj[u].size() == 0) {
		u++;
	}
	euler(u);
	cycle.pop_back();
	for(const auto &u: cycle) {
		fout << u + 1 << " ";
	}
	return 0;
}