Cod sursa(job #2761218)

Utilizator EusebiudistrugatorulLionel Messi Eusebiudistrugatorul Data 1 iulie 2021 10:14:01
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#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
*/