Cod sursa(job #2929596)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 26 octombrie 2022 12:03:01
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 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);
}

void euler(int u) {
	for(const int &it: adj[u]) {
		int v = edges[it].other(u);

		if(!edges[it].visited) {
			edges[it].visited = 1;
			euler(v);
		}
	}

	cycle.push_back(u);
}

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 && start == -1; i++) {
		if(!(adj[i].size() & 1)) {
			start = i;
		}
	}

	if(start == -1) {
		fout << "-1\n";

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

	euler(start);

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

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