Cod sursa(job #2907321)

Utilizator victorzarzuZarzu Victor victorzarzu Data 29 mai 2022 18:32:06
Problema Ciclu Eulerian Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <string>
#include <vector>
#include <stack>

using std::string;
using std::vector;
using std::stack;

class Euler {
private:
	string input_file;
	string output_file;
	int n;
	bool* viz;
	vector<std::pair<int, int>>* graf;
	vector<int> result;

	void read() {
		std::ifstream in(input_file);

		int m, x, y;
		in >> n >> m;

		graf = new vector<std::pair<int, int>>[n + 1];
		for (int i = 1; i <= m; ++i) {
			in >> x >> y;
			graf[x].push_back(std::make_pair(y, i));
			graf[y].push_back(std::make_pair(x, i));
		}
		
		viz = new bool[n + 1];
		for (int i = 1; i <= m; ++i) {
			viz[i] = false;
		}

		in.close();
	}

	void solve() {
		stack<int> s;
		s.push(1);

		while (!s.empty()) {
			int top = s.top();
			if (!graf[top].empty()) {
				auto back = graf[top].back();
				graf[top].pop_back();

				if (!viz[back.second]) {
					viz[back.second] = true;
					s.push(back.first);
				}
			}
			else {
				s.pop();
				result.push_back(top);
			}
		}
	}

public:
	Euler(const string& input_file, const string& output_file) : input_file{ input_file }, output_file{ output_file }{
		read();
		solve();
	};

	void print() {
		std::ofstream out(output_file);

		for (const auto& nod : result) {
			out << nod << " ";
		}

		out.close();
	}
};

int main(int argc, char** argv) {
	
	Euler e{ "ciclueuler.in", "ciclueuler.out" };
	e.print();

	return 0;
}