Pagini recente » Cod sursa (job #2656837) | Istoria paginii runda/12313415151518977 | Clasament oni-2009-ix | Poze preONI 2007 - deschidere | Cod sursa (job #3001450)
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#define NMAX 100005
#define MMAX 500005
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int N, M;
vector<vector<pair<int, int>>> gr;
bool used[MMAX];
void read() {
fin >> N >> M;
gr.resize(N + 1);
int x, y;
for (int i = 0; i < M; ++i) {
fin >> x >> y;
gr[x].emplace_back(y, i);
gr[y].emplace_back(x, i);
}
}
bool isEuler() {
for (int i = 1; i <= N; ++i) {
if (gr[i].size() % 2 == 1) {
return false;
}
}
return true;
}
void euler(int nod) {
stack<int> st;
vector<int> answer;
st.push(nod);
while (!st.empty()) {
int top = st.top();
pair<int, int> edge = make_pair(-1, -1);
for (int i = 0; i < gr[top].size(); ++i) {
pair<int, int> v = gr[top][i];
if (!used[v.second]) {
edge = v;
i = gr[top].size();
}
}
if (edge.first == -1 && edge.second == -1) {
answer.push_back(top);
st.pop();
}
else {
st.push(edge.first);
used[edge.second] = true;
}
}
for (int i = answer.size() - 1; i >= 1; --i) {
fout << answer[i] << " ";
}
fout << "\n";
}
int main()
{
read();
if (!isEuler()) {
fout << -1 << "\n";
}
else {
euler(1);
}
return 0;
}