Pagini recente » Cod sursa (job #1938746) | Cod sursa (job #281284) | Cod sursa (job #735247) | Cod sursa (job #374518) | Cod sursa (job #2094158)
#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <list>
#include <vector>
#include <cstdio>
class Graph {
public:
Graph(int _n) : n(_n), edge(new std::list<int>[_n]) {}
~Graph() { delete[] edge; }
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 (int i = 0; i < n; i++)
if (edge[i].size() % 2 == 1)
return euler; // Euler circuit does not exist.
std::list<int> st;
st.push_back(0);
while (st.size() > 0) {
int v = st.back();
while (edge[v].size() > 0) {
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].size() == 0) {
if (st.size() > 1) // Don't print last element again.
euler.push_back(v);
st.pop_back();
if (st.size() == 0)
break;
v = st.back();
}
}
return euler;
}
private:
int n;
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;
}