Я пытаюсь выяснить, как граф путей соответствии с алгоритмом Эппштейна в этой статье работает, и как я могу восстановить 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.
Ответы:
It's been long enough since I wrote that, that by now my interpretation of what's in there is probably not much more informed than any other reader's. Nevertheless:
I believe that the description you're looking for is the last paragraph of the proof of Lemma 5. Basically, some of the edges in P(G) (the "cross edges") correspond to sidetracks in G (that is, edges that diverge from the shortest path tree). The path in G is formed by following the shortest path tree to the starting vertex of the first sidetrack, following the sidetrack edge itself, following the shortest path tree again to the starting vertex of the next sidetrack, etc.
источник
Pseudocode for Eppstein's algorithm (and the authors' lazy version of it) are given in: V.M. Jiménez, A. Marzal, A lazy version of Eppstein’s shortest paths algorithm, in: 2nd International Workshop on Experimental and Efficient Algorithms (WEA ’03), in: Lecture Notes in Computer Science, vol. 2647, Springer, 2003, pp. 179–190. https://pdfs.semanticscholar.org/3a31/5a14a2fc773d2d800186121905016de31705.pdf
источник