Cod sursa(job #2966378)

Utilizator livliviLivia Magureanu livlivi Data 17 ianuarie 2023 12:14:52
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

void dfs(int node, vector<vector<pair<int, int>>>& edges, vector<bool>& viz, vector<int>& ans) {
	while (!edges[node].empty()) {
		auto edge = edges[node].back();
		if (viz[edge.second]) {
			edges[node].pop_back();
			continue;
		}

		edges[node].pop_back();
		viz[edge.second] = true;
		dfs(edge.first, edges, viz, ans);
	}
	ans.push_back(node);
}

vector<int> euler(vector<vector<pair<int, int>>>& edges, int m) {
	vector<bool> viz(m);
	vector<int> ans;
	dfs(0, edges, viz, ans);
	ans.pop_back();
	reverse(ans.begin(), ans.end());
	return ans;
}

int main() {
	int n, m; in >> n >> m;
	vector<vector<pair<int, int>>> edges(n);
	for (int i = 0; i < m; i++) {
		int a, b; in >> a >> b; a--; b--;
		edges[a].emplace_back(b, i);
		edges[b].emplace_back(a, i);
	}

	auto ans = euler(edges, m);
	for (int i = 0; i < ans.size(); i++) {
		out << ans[i] + 1 << " ";
	}
	out << "\n";
	return 0;
}