Pagini recente » Cod sursa (job #139601) | Cod sursa (job #110375) | Cod sursa (job #705235) | Cod sursa (job #2303750) | Cod sursa (job #2812992)
#include <bits/stdc++.h>
std::ifstream in("ciclueuler.in");
std::ofstream out("ciclueuler.out");
const int N = 1e5 + 1, M = 5e5 + 1;
int n, m;
struct Graph {
std::pair<int, int> edges[M];
std::bitset<M> deleted;
int first_available[N];
std::vector<int> nodes[N];
void add_edge(int u, int v) {
static int edge_idx;
edges[++edge_idx] = {u, v};
nodes[u].push_back(edge_idx);
nodes[v].push_back(edge_idx);
}
bool all_ranks_even() {
return std::all_of(nodes + 1, nodes + n + 1, [&](std::vector<int> &eu) {
return eu.size() % 2 == 0;
});
}
int pop_edge(int u) {
for (int i = first_available[u]; i < int(nodes[u].size()); ++i) {
int e = nodes[u][i];
if (!deleted[e]) {
first_available[u] = i + 1;
deleted[e] = true;
return e;
}
}
return -1;
}
void build_euler_cycle(std::vector<int> &out) {
std::stack<int> st;
st.push(1);
while (!st.empty()) {
int u = st.top();
int e = pop_edge(u);
if (e == -1) {
st.pop();
if (!st.empty()) {
out.push_back(u);
}
continue;
}
int v = edges[e].first + edges[e].second - u;
st.push(v);
}
}
} g;
int main() {
in >> n >> m;
for (int i = 0; i < m; ++i) {
int u, v;
in >> u >> v;
g.add_edge(u, v);
}
if (!g.all_ranks_even()) {
out << "-1\n";
return 0;
}
std::vector<int> cycle;
cycle.reserve(m);
g.build_euler_cycle(cycle);
if (int(cycle.size()) != m) {
out << "-1\n";
return 0;
}
for (auto u : cycle) {
out << u << " ";
}
out << "\n";
}