Pagini recente » Cod sursa (job #1223347) | Cod sursa (job #2828605) | Cod sursa (job #1235018) | Cod sursa (job #3219539) | Cod sursa (job #2761218)
#include <bits/stdc++.h>
#define Intro ios::sync_with_stdio(0), cin.tie(0)
#define ll long long
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
const int E = 5e5 + 5, V = 1e5 + 5;
vector<pair<int, int>> edges[E];
vector<int> nodes;
bitset<E> visited_edge;
stack<int> nodes_list;
int nr_nodes, nr_edges;
void find_eulerian_cycle() {
nodes_list.push(1);
while (!nodes_list.empty()) {
int node = nodes_list.top();
if (edges[node].size()) {
int nr_edge = edges[node].back().second, neighbour = edges[node].back().first;
edges[node].pop_back();
if (visited_edge[nr_edge] == 0) {
visited_edge[nr_edge] = 1;
nodes_list.push(neighbour);
}
} else {
nodes_list.pop();
nodes.push_back(node);
}
}
}
int main() {
fin >> nr_nodes >> nr_edges;
for (int i = 1; i <= nr_edges; ++i) {
int source, dest;
fin >> source >> dest;
edges[source].push_back({dest, i});
edges[dest].push_back({source, i});
}
for (int i = 1; i <= nr_nodes; ++i) {
if (edges[i].size() & 1) {
cout << -1;
return 0;
}
}
find_eulerian_cycle();
nodes.pop_back();
for (int nr : nodes) {
fout << nr << ' ';
}
return 0;
}
/* Plan
- read the statement carefully
- write stuff down (observations and ideas)
- consider the methods
- revise the solution before implementing it
- int overflow
- edge cases
- make the implementation clearly
*/