Во-первых, немного предыстории: я работаю над созданием простого класса графа с базовыми алгоритмами графа (Дейкстра, Флойд-Уоршалл, Беллман-Форд и т. Д.), Чтобы использовать его в качестве справочного листа для предстоящего соревнования по программированию.
Пока у меня есть работающая версия Floyd-Warshall, но недостатком является то, что пока она дает мне только кратчайшее значение расстояния между двумя узлами, а не кратчайший путь. Желательно, чтобы построение пути происходило внутри самого алгоритма, вместо того, чтобы вызывать другую функцию для его восстановления.
Вот некоторая информация о структурах данных, которые я использую:
vector< vector<int> > graph //contains the distance values from each node to each other node (graph[1][3] contains the length of the edge from node #1 to node #3, if no edge, the value is INF
vector< vector<int> > path //contains the "stepping stones" on how to reach a given node. path[st_node][end_node] contains the value of the next node on the way from end_node -> st_node
Вот пример данных графика, который я использую:
INF 10 INF INF INF INF
INF INF 90 15 INF INF
INF INF INF INF INF 20
INF INF INF INF 20 INF
INF INF 5 INF INF INF
INF INF INF INF INF INF
и вот желаемые значения, которые должны быть в переменной "path" (полученной путем запуска Dijkstra из каждого из узлов):
INF 0 4 1 3 2
INF INF 4 1 3 2
INF INF INF INF INF 2
INF INF 4 INF 3 2
INF INF 4 INF INF 2
INF INF INF INF INF INF
Вот ссылка на код, который я сейчас использую для алгоритма: (через PasteBin).
Любая помощь будет принята с благодарностью!
Изменить: Я попробовал код Википедии чтобы сгенерировать матрицу путей и вот результат:
INF INF 4 1 3 4
INF INF 4 INF 3 4
INF INF INF INF INF INF
INF INF 4 INF INF 4
INF INF INF INF INF 2
INF INF INF INF INF INF
Это вроде как работает, но есть проблемы, когда дело доходит до представления «отдельных» шагов. Например, путь от узла 0 к узлу 1 везде не определен. (Но тем не менее, спасибо Nali4Freedom за предложение)
graph
есть только одно ребро от узла №0, и оно ведет к узлу №1. Таким образом, первая строка (или, возможно, первый столбец)path
должна бытьInf 1 1 1 1 1
. Что мне не хватает? - person Beta   schedule 26.10.2010graph
перечисляет ребра, выходящие из этого узла, тогда как каждая строка вpath
содержит путь кnode #[row_num]
. Например, первая строка правильной диаграммыpath
означает, что для того, чтобы добраться до узла 0 (строка = 0) из узла 5 (col = 5), следующим узлом на обратном пути будет узел 2. Чтобы добраться до узла 0 из узла 2 мы используем узел 4, затем узел 3, затем узел 1, а затем, наконец, в нашем пункте назначения с узлом 0. - person Mr. Llama   schedule 26.10.2010