Pagini recente » Cod sursa (job #823353) | Cod sursa (job #1727828) | Cod sursa (job #780894) | Cod sursa (job #1262133) | Cod sursa (job #1520902)
#include <fstream>
using namespace std;
const int MAX_N = 100000;
const int MAX_M = 500000;
const int NIL = -1;
struct Edge {
int v, next;
};
Edge l[2 * MAX_M];
int adj[MAX_N];
int degree[MAX_N];
int st[MAX_M + 1], ss;
void addEdge(int u, int v, int pos) {
l[pos] = { v, adj[u] };
adj[u] = pos;
degree[u]++;
}
void euler(int u, ofstream &out) {
st[ss++] = u;
while (ss) {
u = st[ss - 1];
while (adj[u] != NIL && l[ adj[u] ].v == NIL) {
adj[u] = l[ adj[u] ].next;
}
if (adj[u] != NIL) {
st[ss++] = l[ adj[u] ].v;
l[ adj[u] ^ 1 ].v = NIL;
adj[u] = l[ adj[u] ].next;
} else {
ss--;
if (ss) {
out << 1 + u << ' ';
}
}
}
}
int main(void) {
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
int n, m;
in >> n >> m;
for (int i = 0; i < n; i++) {
adj[i] = NIL;
}
for (int i = 0; i < m; i++) {
int u, v;
in >> u >> v;
addEdge(u - 1, v - 1, 2 * i);
addEdge(v - 1, u - 1, 2 * i + 1);
}
int odd = 0;
while ((odd < n) && ~(degree[odd] & 1)) {
odd++;
}
if (odd < n) {
out << "-1";
} else {
euler(l[0].v, out);
}
out << '\n';
out.close();
return 0;
}