Идеальным решением для вашей структуры данных является список смежностей .
Список смежности - это просто список объектов (представляющих вершины на вашем графике). У каждого объекта есть список, содержащий все вершины, к которым он имеет смежное ребро, и соответствующий вес.
В ruby простая реализация может выглядеть примерно так:
vertices = {}
a = Vertex.new
b = Vertex.new
a.add(b, 10)
b.add(a, 10)
vertices[a] = a
vertices[b] = b
Алгоритм поиска кратчайшего взвешенного пути называется Дейкстры .
Если вы хотите получить кратчайший путь после запуска алгоритма, вы можете выполнить трассировку. Это делается путем сохранения (оптимального) родителя каждого узла по мере его достижения. Для этого у вас может быть хеш для каждого посещенного узла, который отображается на узел, который ведет к нему с наименьшей стоимостью.
Как только вы закончите алгоритм, ваш рекурсивный возврат может выглядеть примерно так:
def traceback(parent, start, node, path)
if(start == node)
(path + start.to_s).reverse
else
path += node.to_s + " "
traceback(parent, start, parent[node], path)
end
end