Cod sursa(job #2821051)

Utilizator XeinIonel-Alexandru Culea Xein Data 22 decembrie 2021 04:03:00
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 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<pair<int, bool>>> Adiacenta;  // {nod_vecin, muchie_de_intoarcere?}
bool vizitat[100009];
vector<int> Solutie;
 
 
void DFS(int nodCurent, int nodTata)
{
    vizitat[nodCurent] = true;
    for (auto& vecin : Adiacenta[nodCurent])
    {
        if (!vizitat[vecin.first])
            DFS(vecin.first, nodCurent);
        else if (vecin.first != nodTata)
            vecin.second = true;
    }
}
 
void Fleury()
{
    Solutie.reserve(M);
    int nodCurent = nodStart;
 
    for (;;)
    {
        Solutie.push_back(nodCurent);
 
        int nodUrmator = 0;
        auto it = Adiacenta[nodCurent].begin();
        for (; it != Adiacenta[nodCurent].end(); ++it)
        {
            nodUrmator = it->first;
            if (it->second)
                break;
        }
 
        if (nodUrmator)
        {
            Adiacenta[nodCurent].erase(it);
            for (it = Adiacenta[nodUrmator].begin(); it != Adiacenta[nodUrmator].end(); ++it)
                if (it->first == 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, false});
        Adiacenta[y].push_back({x, false});
    }
    DFS(nodStart, 0);
    Fleury();
 
    if (Solutie.size() != M)
        g << -1;
    else
        for (auto nod : Solutie)
            g << nod << ' ';
 
    return 0;
}