Pagini recente » Cod sursa (job #909290) | Cod sursa (job #3237096) | Cod sursa (job #2889534) | rar91 | Cod sursa (job #3261600)
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("sse,avx,fma,avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;
void solve() {
int n, m;
cin >> n >> m;
vector<int> self_edges(n, 0);
vector<vector<int>> adj(n);
vector<pair<int, int>> edges;
for (int i = 0, u, v; i < m; ++i) {
cin >> u >> v;
--u, --v;
if (u == v) {
++self_edges[u];
continue;
}
edges.emplace_back(u, v);
adj[u].push_back(edges.size() - 1);
adj[v].push_back(edges.size() - 1);
}
vector<bool> vis(n, false);
function<void(int)> dfs = [&adj, &vis, &dfs, &edges](int u) {
vis[u] = true;
for (int index : adj[u]) {
int v = edges[index].first + edges[index].second - u;
if (!vis[v])
dfs(v);
}
};
int start_node = -1;
bool did_dfs = false;
for (int i = 0; i < n; ++i) {
if (adj[i].size() & 1) {
cout << "-1\n";
return;
}
if (adj[i].size() + self_edges[i] == 0 || vis[i]) {
continue;
}
if (did_dfs) {
cout << "-1\n";
return;
}
dfs(i);
did_dfs = true;
start_node = i;
}
vis.clear();
stack<int> st;
vector<int> tour;
st.push(start_node);
while (!st.empty()) {
int u = st.top();
if (!adj[u].empty()) {
int index = adj[u].back();
if (edges[index].first != -1) {
int v = edges[index].first + edges[index].second - u;
edges[index].first = -1;
st.push(v);
}
adj[u].pop_back();
} else {
if (st.size() == 1 && adj[u].empty()) {
st.pop();
continue;
}
tour.push_back(u);
st.pop();
}
}
for (int u : tour) {
while (self_edges[u]-- > 0)
cout << u + 1 << ' ';
cout << u + 1 << ' ';
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
#endif
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}