Cod sursa(job #2821052)

Utilizator XeinIonel-Alexandru Culea Xein Data 22 decembrie 2021 04:15:38
Problema Ciclu Eulerian Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
#include <utility>
 
using namespace std;
 
std::ifstream f("ciclueuler.in");
std::ofstream g("ciclueuler.out");
int N, M, nodStart;
vector<vector<int>> Adiacenta;
bool vizitat[100009];
vector<int> Solutie;
 
void Parcurgere()
{
    Solutie.reserve(M);
    int nodCurent = nodStart;
 
    for (;;)
    {
        Solutie.push_back(nodCurent);
 
        int nodUrmator = Adiacenta[nodCurent].size() > 0 ? Adiacenta[nodCurent][0] : 0;
 
        if (nodUrmator)
        {
            Adiacenta[nodCurent].erase(Adiacenta[nodCurent].begin());
            for (auto it = Adiacenta[nodUrmator].begin(); it != Adiacenta[nodUrmator].end(); ++it)
                if (*it == nodCurent)
                {
                    Adiacenta[nodUrmator].erase(it);
                    break;
                }
            nodCurent = nodUrmator;
        }
        else
            break;
    }
 
    Solutie.pop_back();
}
 
int main()
{
    f >> N >> M;
    Adiacenta.resize(N + 1);
    for (int x, y, i = 0; i < M; ++i)
    {
        f >> x >> y;
        nodStart = x;
        Adiacenta[x].push_back(y);
        Adiacenta[y].push_back(x);
    }

    Parcurgere();
 
    if (Solutie.size() != M)
        g << -1;
    else
        for (auto nod : Solutie)
            g << nod << ' ';
 
    return 0;
}