Cod sursa(job #2527832)

Utilizator mirceatlxhaha haha mirceatlx Data 20 ianuarie 2020 21:45:45
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100005
using namespace std;

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

int N, M;
vector < pair <int,int> > G[NMAX];
vector <int> ans;
stack <int> st;
bool viz[NMAX];
 
bool ifIsEuler()
{
	for(int i = 1; i <= N; i++){
		if(G[i].size() % 2 == 1){
			return false;
		}
	}
	return true;
}

void Euler()
{
	int u, v, ok;
	st.push(1);
	while(!st.empty()){
		ok = 0;
		u = st.top();
		while(G[u].size() && viz[G[u].back().first]){
			G[u].pop_back();
		}
		if(G[u].size()){
			v = G[u].back().second;
			viz[G[u].back().first] = true;
			G[u].pop_back();
			st.push(v);
			ok = 1;
		}
		if(!ok){
			st.pop();
			if(!st.empty()){
				ans.push_back(st.top());
			}
		}
	}
}

int main()
{
	int x, y;
	fin >> N >> M;
	for(int i = 1; i <= M; i++){
		fin >> x >> y;
		G[x].push_back(make_pair(i,y));
		G[y].push_back(make_pair(i,x));	
	}
	if(!ifIsEuler()){
		fout << -1 << "\n";
		return 0;
	}
	Euler();
	for(int i = 0; i < ans.size(); i++){
		fout << ans[i] << " ";
	}
	return 0;
}