Pagini recente » Cod sursa (job #3183777) | Cod sursa (job #1351905) | Cod sursa (job #2808763) | Cod sursa (job #1231116) | Cod sursa (job #2966379)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
void dfs(int node, vector<vector<pair<int, int>>>& edges, vector<bool>& viz, vector<int>& ans) {
while (!edges[node].empty()) {
auto edge = edges[node].back();
if (viz[edge.second]) {
edges[node].pop_back();
continue;
}
edges[node].pop_back();
viz[edge.second] = true;
dfs(edge.first, edges, viz, ans);
}
ans.push_back(node);
}
bool is_eulerian(vector<vector<pair<int, int>>>& edges) {
for (auto node_edges : edges) {
if (node_edges.size() & 1) {
return false;
}
}
return true;
}
vector<int> euler(vector<vector<pair<int, int>>>& edges, int m) {
if (!is_eulerian(edges)) {
return vector<int>(1, -2);
}
vector<bool> viz(m);
vector<int> ans;
dfs(0, edges, viz, ans);
ans.pop_back();
reverse(ans.begin(), ans.end());
return ans;
}
int main() {
int n, m; in >> n >> m;
vector<vector<pair<int, int>>> edges(n);
for (int i = 0; i < m; i++) {
int a, b; in >> a >> b; a--; b--;
edges[a].emplace_back(b, i);
edges[b].emplace_back(a, i);
}
auto ans = euler(edges, m);
for (int i = 0; i < ans.size(); i++) {
out << ans[i] + 1 << " ";
}
out << "\n";
return 0;
}