Calcular o caminho euleriano em PHP
Um caminho euleriano em um grafo é o caminho que usa cada aresta exatamente uma vez. Se tal caminho existir, o grafo é chamado traversável. Um ciclo euleriano é um ciclo que usa cada aresta exatamente uma vez. O ciclo euleriano é utilizado para resolver o problema do caixeiro viajante.
Existe um conceito paralelo: um caminho hamiltoniano em um grafo é o caminho que visita cada nodo uma só vez; e um ciclo hamiltoniano é um ciclo que visita cada vértice uma só vez. O caminho hamiltoniano é utilizado para resolver o problema do carteiro chinês.
O algoritmo a seguir descobre o ciclo euleriano utilizando "Cycle finding algorithm".
This algorithm is based on the following observation: if C is any cycle in a Eulerian graph, then after removing the edges of C, the remaining connected components will also be Eulerian graphs.
The algorithm consists in finding a cycle in the graph, removing its edges and repeating this steps with each remaining connected component. It has a very compact code with recursion:
'tour' is a stack
find_tour(u):
for each edge e=(u,v) in E:
remove e from E
find_tour(v)
prepend u to tour
to find the tour, clear stack 'tour' and call find_tour(u),
where u is any vertex with a non-zero degree.

