Cod sursa(job #2819993)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 19 decembrie 2021 16:38:00
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 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)
{
    unordered_map<int, int> ctMuch;  //nr de noduri adiacente unui nod
    for(int i = 1; i <lisAdiacenta.size(); ++i) {
        ctMuch[i] = lisAdiacenta[i].size();
    }

    stack<int> drumCurent;
    vector<int> 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] << " ";
    }

  /*  for(int i = 0; i < copie.size(); ++i) {
        for(int j = 0; j < copie[i].size(); ++j)
            fout << copie[i][j] << " ";
        fout << "\n";
    }*/
    return 0;
}