Cod sursa(job #3215043)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 14 martie 2024 17:33:46
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 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 s) {
	stack<int> st;
	st.emplace(s);
	while(!st.empty()) {
		int u = st.top();
		if(adj[u].empty()) {
			cycle.emplace_back(u);
			st.pop();
		} else {
			int idx = adj[u].back(), v = edges[idx].other(u);
			adj[u].pop_back();
			bool &rem = edges[idx].rem;
			if(!rem) {
				rem = 1;
				st.emplace(v);
			}
		}
	}
}

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;
}