Cod sursa(job #2650303)

Utilizator LeCapataIustinian Serban LeCapata Data 18 septembrie 2020 10:40:35
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define N 100005
using namespace std;

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

vector<pair<int, int>> lat[N];
vector<int> ordine;
bool vizitat[5*N];

void dfs(int start)
{
	stack<int> stiva;
	stiva.push(start);

	while(!stiva.empty()){
		int nod = stiva.top();
		stiva.pop();

		if(lat[nod].size() == 0) ordine.push_back(nod);
		else{
			int urmator = lat[nod].back().first;
			int tip = lat[nod].back().second;

			lat[nod].pop_back();
			stiva.push(nod);

			if (!vizitat[tip]){
				vizitat[tip] = true;
				stiva.push(urmator);
			}
		}
	}
}

int main()
{
	int n, m;
	in>>n>>m;

	for (int i = 0; i < m; i++){
		int x, y;
		in >> x >> y;
		lat[x].push_back({y, i});
		lat[y].push_back({x, i});
	}

	for (int i = 1; i <= n; i++){
		if(lat[i].size() % 2 == 1){
			out << -1;
			return 0;
		}
	}

	dfs(1);
	ordine.pop_back();

	for (size_t i = 0; i < ordine.size(); ++i)
		out<<ordine[i]<<" ";

    in.close();
    out.close();
	return 0;
}