Cod sursa(job #2820000)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 19 decembrie 2021 17:09:07
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;

//https://www.geeksforgeeks.org/eulerian-path-and-circuit/
//https://www.geeksforgeeks.org/hierholzers-algorithm-directed-graph/
//Algoritmul lui Hierholzer

vector<vector<int>> citireLisAdiacenta()
{
    ifstream fin("ciclueuler.in");
    vector<vector<int>> lisAdiacenta;

    int N, M;
    fin >> N >> M;
    lisAdiacenta.resize(N+1);

    for (int i = 1; i <= M; ++i) {
        int x, y;
        fin >> x >> y;
        lisAdiacenta[x].push_back(y);
    }

    return lisAdiacenta;
}

vector<int> circuitEuler(vector<vector<int>> &lisAdiacenta)
{
    stack<int> drumCurent;
    vector<int> circuit;
/*
    for(int i = 1; i < lisAdiacenta.size(); ++i) {
        if(lisAdiacenta[i].size() %2 == 1) {
        circuit.push_back(-1);
        return circuit;
        }
    }
*/
    //incepem din primul nod
    drumCurent.push(1);
    int nodCurent = 1;

    while (!drumCurent.empty()) {
        if (lisAdiacenta[nodCurent].size()) {
            drumCurent.push(nodCurent);
            int nodUrm = lisAdiacenta[nodCurent].back();
            lisAdiacenta[nodCurent].pop_back();

            nodCurent = nodUrm;
        }
        else {
            circuit.push_back(nodCurent);
            nodCurent = drumCurent.top();
            drumCurent.pop();
        }
    }

    return circuit;
}

int main()
{

    ofstream fout("ciclueuler.out");
    vector<vector<int>> lisAdiacenta;
    lisAdiacenta = citireLisAdiacenta();

    vector<vector<int>> copie;
    copie = lisAdiacenta;

    vector<int> circuit = circuitEuler(copie);
    for(int i = 0; i < circuit.size(); ++i) {
        fout << circuit[i] << " ";
    }

    return 0;
}