Cod sursa(job #2818718)

Utilizator bianca_voicuBianca Voicu bianca_voicu Data 16 decembrie 2021 19:16:41
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>

using namespace std;

const int INF = 1 << 30;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");


class Graph {
private:
    int _n, _m;
    vector<vector<int>> _adjacentList; // liste de adiacenta

    vector<vector<pair<int, int> >> _adjacentListMultigraph;


public:
    Graph(int nodes, int edges) : _n(nodes), _m(edges) {}

    void addEdgesMultigraph();

    vector<int> ciclueuler(int start);
};

void Graph::addEdgesMultigraph() {
    int x, y;
    _adjacentListMultigraph.resize(_n + 1);

    for (int i = 1; i <= _m; ++i) {
        f >> x >> y;
        _adjacentListMultigraph[x].push_back(make_pair(y, i));
        _adjacentListMultigraph[y].push_back(make_pair(x, i));
    }
}

vector<int> Graph::ciclueuler(int start) {
    vector<int> answer;
    vector<int> visitedEdges(_m + 1, 0);

    for (int i = 0; i < _n; ++i)
        if (_adjacentListMultigraph[i].size() % 2 != 0) {
            answer.push_back(-1);
            return answer;
        }

    stack<int> euler;
    euler.push(start);

    while (!euler.empty()) {
        int currentNode = euler.top();

        if (_adjacentListMultigraph[currentNode].size() != 0) {
            int neighbour = _adjacentListMultigraph[currentNode].back().first;
            int index = _adjacentListMultigraph[currentNode].back().second;
            _adjacentListMultigraph[currentNode].pop_back();

            if (visitedEdges[index] == 0) {
                visitedEdges[index] = 1;
                euler.push(neighbour);
            }
        } else {
            euler.pop();
            answer.push_back(currentNode);
        }
    }

    return answer;
}

int main() {
    int n, m;
    f >> n >> m;
    Graph gr(n, m);
    gr.addEdgesMultigraph();
    vector<int> answer = gr.ciclueuler(1);
    if (answer[0] == -1) {
        g << -1;
    } else {
        for (int i = 0; i < answer.size() - 1; ++i) {
            g << answer[i] << " ";
        }
    }
    f.close();
    g.close();
    return 0;
}