Pagini recente » Cod sursa (job #1919043) | Cod sursa (job #1845533) | Cod sursa (job #1951916) | Cod sursa (job #2275400) | Cod sursa (job #2821047)
#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;
}