Я намагаюся з'ясувати, як працює Графік шляху згідно алгоритму Еппштейна в цій статті і як я можу реконструювати k найкоротші шляхи від s до t відповідною конструкцією купи H ( G ) .
Так далеко:
містить всі ребразалишаючи вершину V в графі G , які не є частиною найкоротшого шляху в G . Їх впорядковано "пустотою часу" під назвою δ ( e ) при використанні цього краю замість того, що знаходиться на найкоротших шляхах. Застосовуючи Дейкстру, я знаходжу найкоротші шляхи до кожної вершини від t .
Я можу обчислити це, взявши довжину ребра + (значення вершини голови (куди спрямований край спрямований) - значення верхівки хвоста (де починається спрямований край). Якщо це це не на найкоротшому шляху, якщо він = 0 - на найкоротшому шляху.
Тепер я будую 2-Min-Heap шляхом нагрівання набору ребер o u t ( v ) відповідно до їх δ ( e ) для будь-якого v ∈ V , де корінь o u t r o o t ( v ) має лише одну дитину (= піддерево).
Для побудови я вставляю o u t r o o t ( v ) в H T ( n e x t T ( v ) ), починаючи з кінцевої вершини t . Кожен раз, коли вершину якимось чином торкається під час вставки, вона позначається символом ∗ .
Тепер я можу побудувати , вставивши решту 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 ) має лише ступінь виходу 4 макс.
шляху «секпочинаючи з т повинні бути взаємно-однозначна відповідність між довжиною S - т -paths в G .
Врешті-решт будується нова купа, замовлена 4-Heap . Кожна вершина відповідає шляху в P ( G ), укоріненому на r . Батько будь-якої вершини має один менший край. Вага вершини - це довжина відповідного шляху.
Щоб знайти найкоротших шляхів, я використовую BFS до P ( G ) і "перевожу" результат пошуку до шляхів, використовуючи H ( G ) .
На жаль, я не розумію, як я можу "прочитати" а потім "перевести" його через H ( G ), щоб отримати k найкоротші шляхи.