Cod sursa(job #3266864)

Utilizator Octa-pe-infoNechifor Octavian Octa-pe-info Data 10 ianuarie 2025 18:19:29
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>
#include <stack>
#include <unordered_map>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

const int MAXN = 100000;
vector<vector<pair<int, int>>> tabel(MAXN + 1);
vector<bool> viz;
vector<int> grad;
stack<int> drum;
vector<int> ciclu;

void gaseste(int start) {

    drum.push(start);

    while (!drum.empty()) {

        int node = drum.top();

        if (!tabel[node].empty()) {

            auto [next_node, edge_id] = tabel[node].back();

            tabel[node].pop_back();

            if (!viz[edge_id]) {

                viz[edge_id] = true;
                drum.push(next_node);
            }
        } else {

            ciclu.push_back(node);
            drum.pop();
        }
    }
}

int main() {
    int N, M;
    fin >> N >> M;

    grad.resize(N + 1, 0);
    viz.resize(M, false);

    for (int i = 0; i < M; ++i) {
        int u, v;
        fin >> u >> v;
        tabel[u].emplace_back(v, i);
        tabel[v].emplace_back(u, i);
        grad[u]++;
        grad[v]++;
    }

    for (int i = 1; i <= N; ++i) {
        if (grad[i] % 2 != 0) {
            fout << -1 << "\n";
            return 0;
        }
    }

    int start = -1;
    for (int i = 1; i <= N; ++i) {
        if (!tabel[i].empty()) {
            start = i;
            break;
        }
    }

    if (start == -1) {
        fout << -1 << "\n";
        return 0;
    }

    gaseste(start);

    if (ciclu.size() != M + 1) {
        fout << -1 << "\n";
        return 0;
    }

    for (int i = 0; i < ciclu.size() - 1; ++i) {
        fout << ciclu[i] << " ";
    }
    fout << ciclu.back() << "\n";

    return 0;
}