Cod sursa(job #3194825)

Utilizator andu9andu nita andu9 Data 19 ianuarie 2024 14:31:34
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <utility>
#include <vector>
#include <bitset>

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

const int nMax = 5e5;

std::bitset<nMax> vis;

std::vector<int> cycle;
std::vector<std::vector<std::pair<int, int>>> multigraph;

void euler (int currentNode) {
    while (multigraph[currentNode].size () > 0) {
        int nextNode = multigraph[currentNode].back ().first;
        int edge = multigraph[currentNode].back ().second;
        multigraph[currentNode].pop_back ();

        if (vis[edge] == false)
            vis[edge] = true, euler (nextNode);
    }

    cycle.emplace_back (currentNode);
}

int main () {
    int n, m; fin >> n >> m;
    std::vector<int> degree(n, 0);
    multigraph.assign (n, std::vector<std::pair<int, int>> ());
    for (int i = 0; i < m; i += 1) {
        int x, y; fin >> x >> y; x -= 1, y -= 1;
        degree[x] += 1, degree[y] += 1;

        multigraph[x].emplace_back (std::make_pair (y, i));
        multigraph[y].emplace_back (std::make_pair (x, i));
    }


    for (int i = 0; i < n; i += 1)
        if (degree[i] % 2 != 0) {
            return 0;
        }

    euler (0);

    for (int i = 0; i < (int) cycle.size () - 1; i += 1)
        fout << cycle[i] + 1 << ' ';
    return 0;
}