Cod sursa(job #2841858)

Utilizator Langa_bLanga Radu Langa_b Data 30 ianuarie 2022 16:12:25
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <vector>
#include <algorithm>
#include <fstream>
#include <stack>
using namespace std;
ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");
vector<vector<pair<int, int>>>gr;
stack <int> st;
int n, m, used[500002], loc[100002];
vector<int> ans;
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> m;
	for (int i = 0; i <= n; i++) {
		gr.emplace_back(vector<pair<int, int>>());
	}
	int x, y;
	for (int i = 1; i <= m; i++) {
		cin >> x >> y;
		gr[x].push_back({y, i});
		gr[y].push_back({x, i});
	}
	for (int i = 1; i <= n; i++) {
		if (gr[i].size() % 2 == 1 || gr[i].size() == 0) {
			cout << -1;
			return 0;
		}
	}
	st.push(1);
	while (st.empty() != 1) {
		int act = st.top();
		for (int z = loc[act]; z < gr[act].size(); z++) {
			int nxt = gr[act][z].first;
			int nr = gr[act][z].second;
			if (used[nr] == 0) {
				used[nr] = 1;
				loc[act]++;
				st.push(nxt);
				act = nxt;
				z = loc[act] - 1;
			}
		}
		act = st.top();
		ans.emplace_back(act);
		st.pop();
	}
	if (ans.size() - 1 != m) {
		cout << -1;
		return 0;
	}
	ans.pop_back();
	for (int i = 0; i < ans.size(); i++) {
		cout << ans[i] << ' ';
	}
}