Cod sursa(job #2929638)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 26 octombrie 2022 13:04:15
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5;

int n, m;
vector<int> adj[NMAX + 1];

struct Edge {
	int u, v;
	bool visited;

	int other(int node) {
		return u ^ v ^ node;
	}
};

vector<Edge> edges;
vector<int> cycle;

void addEdge(int u, int v) {
	int m = edges.size();
	edges.push_back({u, v, 0});
	adj[u].push_back(m);
	adj[v].push_back(m);
}

stack<int> st;
int _u, _v;
void euler() {
	if((int) st.size() > 0) {
		_u = st.top();
		if((int) adj[_u].size() > 0) {
			int it = adj[_u].back();
			adj[_u].pop_back();

			_v = edges[it].other(_u);

			if(edges[it].visited == 0) {
				edges[it].visited = 1;
				st.push(_v);
			}
			euler();
		} else {
			cycle.push_back(_u);
			st.pop();
			euler();
		}
	}
}

int main() {
	ios_base :: sync_with_stdio(false);

	fin >> n >> m;

	for(int i = 0; i < m; i++) {
		int u, v;
		fin >> u >> v;

		addEdge(u, v);
	}
	
	int start = 1;
	for(int i = 1; i <= n; i++) {
		if((int) adj[i].size() > 0) {
			start = i;
			if(((int) adj[i].size() & 1) != 0) {
				fout << "-1\n";

				fin.close();
				fout.close();
				return 0;
			}
		}
	}

	st.push(start);
	euler();

	reverse(cycle.begin(), cycle.end());
	cycle.pop_back();

	if((int) cycle.size() < m) {
		fout << "-1\n";
		
		fin.close();
		fout.close();
		return 0;
	}

	for(const int &it: cycle) {
		fout << it << " ";
	}
	fout << '\n';

	fin.close();
	fout.close();
	return 0;
}