Cod sursa(job #2821037)

Utilizator XeinIonel-Alexandru Culea Xein Data 22 decembrie 2021 02:01:44
Problema Ciclu Eulerian Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>
#include <vector>
#include <utility>

using namespace std;

std::ifstream f("ciclueuler.in");
std::ofstream g("ciclueuler.out");
int N, M;
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 = 1;

    for (;;)
    {
        Solutie.push_back(nodCurent);

        int nodUrmator = 0;
        int idx;
        for (int i = 0; i < Adiacenta[nodCurent].size(); ++i)
        {
            if (Adiacenta[nodCurent][i].first != 0)
            {
                idx = i;
                nodUrmator = Adiacenta[nodCurent][i].first;
                if (Adiacenta[nodCurent][i].second)
                    break;
            }
        }

        if (nodUrmator)
        {
            Adiacenta[nodCurent][idx].first = 0;
            for (int i = 0; i < Adiacenta[nodUrmator].size(); ++i)
                if (Adiacenta[nodUrmator][i].first == nodCurent)
                {
                    Adiacenta[nodUrmator][i].first = 0;
                    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;
        Adiacenta[x].push_back({y, false});
        Adiacenta[y].push_back({x, false});
    }
    DFS(1, 0);
    Fleury();

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

    return 0;
}