Я пытаюсь выяснить, как граф путей соответствии с алгоритмом Эппштейна в этой статье работает, и как я могу восстановить k кратчайших путей от s до t с соответствующей конструкцией кучи H ( G ) .
Слишком далеко:
содержит все ребраоставляя вершину V в графе G , которые не являются частью кратчайшего пути в G . Они упорядочены в куче за счет «траты времени», называемой δ ( e ), при использовании этого ребра, а не на кратчайших путях. Применяя Дейкстру, я нахожу кратчайшие пути к каждой вершине из t .
Я могу рассчитать это, взяв длину ребра + (значение вершины головы (на которое указывает направленный край) - значение вершины хвоста (где начинается направленный край). Если это это не на кратчайшем пути, если = 0, то на кратчайшем пути.
Теперь я строю 2-мин-кучу , накапливая множество ребер o u t ( v ) в соответствии с их δ ( e ) для любого v ∈ V , где корень o u t r o есть только один дочерний элемент (= поддерево).
Для того чтобы построить я Вкладыш о у т т о о т ( V ) в Н Т ( п е х т Т ( v ) ) , начиная с вершины терминала т . Каждый раз, когда при вставке к вершине как-то дотрагиваются, она помечается знаком ∗ .
Теперь я могу построить , вставив оставшуюся часть H o u t ( w ) в H T ( v ) . Каждая вершина в H G ( v ) содержит либо 2 детей из H T ( v ) и 1 из H o u t ( w ), либо 0 из первого и 2 из второго и представляет собой 3-кучу.
С помощью я могу построить DAG с именем D ( G ), содержащую вершину для каждой ∗ -отмеченной вершины из H T ( v ) и для любой некорневой вершины из H o u t ( v ) .
Корни в D ( G ) называются h ( v ) и связаны с вершинами, которым они принадлежат, согласно o u t ( v ) посредством «отображения».
Все идет нормально.
В статье говорится, что я могу построить , вставив корень r = r ( s ) и соединив его с h ( s ) начальным ребром с δ ( h ( s ) ) . Вершины D ( G ) одинаковы в P ( G ), но они не взвешены. Края имеют длину. Тогда для каждого направленного ребра ( u , v ) ∈ D ( G ) соответствующие ребра в создаются и взвешиваются по δ ( v ) - δ ( u ) . Их называют кучей краев. Тогда для каждой вершины v ∈ P ( G ) , представляющей ребро, не входящее в кратчайший путь, соединяющий пару вершин u и w , создаются «поперечные ребра» из v в h ( w ) в P ( G ), имеющие длину δ ( ч ( ш . Каждая вершина в P ( G ) только имеет выходную степень max.
's paths starting from are supposed to be a one-to-one length correspondence between --paths in .
In the end a new heap ordered 4-Heap is build. Each vertex corresponds to a path in rooted at . The parent of any vertex has one fewer edge. The weight of a vertex is the lenght of the corresponding path.
To find the shortest paths I use BFS to and "translate" the search result to paths by using .
Unfortunately, I don't understand how I can "read" and then "translate" it through to receive the shortest paths.