Pagini recente » Cod sursa (job #127504) | Cod sursa (job #2693733) | Cod sursa (job #2799456) | Cod sursa (job #2480792) | Cod sursa (job #1915836)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
struct Edge {
int fn, sn;
bool deleted;
};
const int NN = 1e5, NE = 5e5;
Edge e[NE];
int N, E, i;
vector <int> G[NN];
stack <int> S;
bool notEulerCircuit() {
for (auto &it: G)
if (it.size() & 1)
return 1;
return 0;
}
inline int get_nextNode(int node, int edge) {
int next;
(node == e[edge].fn) ? next = e[edge].sn : next = e[edge].fn;
return next;
}
inline bool deleted(int edge) {
return (e[edge].deleted);
}
void deleteEdge(int edge) {
e[edge].deleted = true;
}
void printCircuit(int start) {
S.push(start);
while (!S.empty()) {
int crtNode = S.top();
if (!G[crtNode].empty()) {
int crtEdge = G[crtNode].back();
G[crtNode].pop_back();
if (deleted(crtEdge))
continue;
deleteEdge(crtEdge);
S.push(get_nextNode(crtNode, crtEdge));
} else {
out << S.top() << ' ';
S.pop();
}
}
}
int main()
{
in >> N >> E;
for (i = 1; i <= E; ++i) {
in >> e[i].fn >> e[i].sn;
G[e[i].fn].push_back(i);
G[e[i].sn].push_back(i);
}
if (notEulerCircuit()) {
out << "-1\n";
} else {
printCircuit(1);
}
return 0;
}