Cod sursa(job #3283590)

Utilizator amcbnCiobanu Andrei Mihai amcbn Data 9 martie 2025 22:07:44
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
using namespace std;

class InParser {
private:
	FILE* fin;
	char* buff;
	int sp;

	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}

public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}

	InParser& operator >> (int& n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		}
		else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}

	InParser& operator >> (long long& n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		}
		else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
} fin("input.in");
ofstream fout("output.out");

const int nmax = 100'000;
const int mmax = 500'000;
int n, m;
struct Edge {
	int from, to;
	bool visited = false;
} e[mmax + 5];
vector<int> adj[nmax + 5];
int degree[nmax + 5];

int main() {
	fin >> n >> m;
	for (int i = 1; i <= m; ++i) {
		int u, v;
		fin >> u >> v;
		e[i].from = u, e[i].to = v;
		adj[u].emplace_back(i);
		adj[v].emplace_back(i);
		degree[u]++;
		degree[v]++;
	}
	if (!all_of(degree + 1, degree + n + 1, [&](int x) { return x % 2 == 0; })) {
		fout << -1;
		return 0;
	}
	stack<int> st;
	st.push(1);
	int cnt = 0;
	while (st.size() && cnt < m) {
		int u = st.top();
		// eliminam muchiile deja vizitate
		while (adj[u].size() && e[adj[u].back()].visited) {
			adj[u].pop_back();
		}
		if (adj[u].empty()) {
			fout << u << " ";
			++cnt;
			st.pop();
		}
		else {
			int i = adj[u].back();
			int v = e[i].from ^ e[i].to ^ u;
			e[i].visited = true; // marcam muchia ca vizitata
			st.push(v);
		}
	}
}