Pagini recente » Cod sursa (job #392771) | Cod sursa (job #2149382) | Cod sursa (job #508287) | Cod sursa (job #2011809) | Cod sursa (job #3215043)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
struct edge_t {
int u, v;
bool rem;
edge_t() {}
edge_t(int u, int v, bool rem): u(u), v(v), rem(rem) {}
int other(int node) {
return node ^ u ^ v;
}
};
vector<edge_t> edges;
vector<vector<int>> adj;
vector<int> cycle;
void euler(int s) {
stack<int> st;
st.emplace(s);
while(!st.empty()) {
int u = st.top();
if(adj[u].empty()) {
cycle.emplace_back(u);
st.pop();
} else {
int idx = adj[u].back(), v = edges[idx].other(u);
adj[u].pop_back();
bool &rem = edges[idx].rem;
if(!rem) {
rem = 1;
st.emplace(v);
}
}
}
}
int main() {
int n, m;
fin >> n >> m;
adj = vector<vector<int>>(n);
for(int i = 0; i < m; i++) {
int u, v;
fin >> u >> v;
u--; v--;
int idx = edges.size();
edges.emplace_back(u, v, 0);
adj[u].emplace_back(idx);
adj[v].emplace_back(idx);
}
int u = 0;
while(u < n && !(adj[u].size() & 1)) {
u++;
}
if(u < n) {
fout << "-1\n";
return 0;
}
u = 0;
while(u < n && adj[u].size() == 0) {
u++;
}
euler(u);
cycle.pop_back();
for(const auto &u: cycle) {
fout << u + 1 << " ";
}
return 0;
}