Cod sursa(job #2821046)

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

using namespace std;

std::ifstream f("ciclueuler.in");
std::ofstream g("ciclueuler.out");
size_t N, M, nodStart;
vector<vector<vector<size_t>>> Adiacenta;  // {nod vecin, muchie de intoarcere?, indexul muchiei in lista lui nod_vecin}
bool vizitat[100009];
vector<int> Solutie;


void DFS(size_t nodCurent, size_t nodTata)
{
    vizitat[nodCurent] = true;
    for (auto& muchie : Adiacenta[nodCurent])
    {
        if (!vizitat[muchie[0]])
            DFS(muchie[0], nodCurent);
        else if (muchie[0] != nodTata)
            muchie[1] = 1;
    }
}

void Fleury()
{
    Solutie.reserve(M);
    int nodCurent = nodStart;

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

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

        if (nodUrmator)
        {
            Adiacenta[nodCurent][idx][0] = 0;
            idx = Adiacenta[nodCurent][idx][2];
            Adiacenta[nodUrmator][idx][0] = 0;

            nodCurent = nodUrmator;
        }
        else
            break;
    }

    Solutie.pop_back();
}

int main()
{
    f >> N >> M;
    Adiacenta.resize(N + 1);
    for (size_t x, y, i = 0; i < M; ++i)
    {
        f >> x >> y;
        nodStart = x;
        if (x != y)
        {
            Adiacenta[x].push_back({y, 0, Adiacenta[y].size()});
            Adiacenta[y].push_back({x, 0, Adiacenta[x].size() - 1});
        }
        else
        {
            Adiacenta[x].push_back({y, 0, Adiacenta[y].size() + 1});
            Adiacenta[y].push_back({x, 0, Adiacenta[x].size() - 1});
        }
    }
    DFS(nodStart, 0);
    Fleury();

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

    return 0;
}