Cod sursa(job #2094164)

Utilizator belgun_adrianBelgun Dimitri Adrian belgun_adrian Data 25 decembrie 2017 11:39:57
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#define _CRT_SECURE_NO_WARNINGS

#include <algorithm>
#include <list>
#include <vector>

#include <cstdio>

class Graph {
public:
	Graph(int n) : edge(n) {}

	void add_edge(int u, int v) {
		edge[u].push_back(v);
		edge[v].push_back(u);
	}

	std::vector<int> compute_euler() {
		std::vector<int> euler;
		//for (std::list<int>& el : edge)
		//	if (el.size() % 2 == 1)
		//		return euler; // Euler circuit does not exist.

		std::list<int> st;
		st.push_back(0);
		while (!st.empty()) {
			int v = st.back();
			while (!edge[v].empty()) {
				int u = edge[v].front();
				edge[v].pop_front();
				edge[u].erase(std::find(edge[u].begin(), edge[u].end(), v));
				st.push_back(u);
				v = u;
			}
			while(edge[v].empty()) {
				// if (st.size() > 1) // Don't print last element again.
					euler.push_back(v);
				st.pop_back();
				if (st.empty())
					break;
				v = st.back();
			}
		}

		return euler;
	}

private:
	std::vector<std::list<int>> edge;
};

int main() {
	FILE *in = fopen("ciclueuler.in", "r");

	int n, m;
	fscanf(in, "%d %d", &n, &m);

	Graph g(n);
	for (int i = 0; i < m; i++) {
		int u, v;
		fscanf(in, "%d %d", &u, &v);
		g.add_edge(u - 1, v - 1);
	}

	fclose(in);

	std::vector<int> euler = g.compute_euler();

	FILE *out = fopen("ciclueuler.out", "w");
	if (euler.size() == 0) {
		fprintf(out, "-1\n");
	} else {
		for (int x : euler)
			fprintf(out, "%d ", x + 1);
		fprintf(out, "\n");
	}
	fclose(out);

	return 0;
}