На самом деле, модифицированная функция DFS, которую я назвал «enumerate», решила этот вопрос. Ради потомков, вот код, который я использовал, чтобы превратить вывод многолучевого Dijkstra в массив путей:

тоящее время я пишу библиотеку PHP для графиков. Я уже успешно реализовал односторонний алгоритм Дейкстры, но сейчас борюсь с реализацией многопутевой версии на этапе реконструкции пути.

Возьмите следующий график:

Этот граф, для простоты, имеет только пути от вершины A до J, проходящие через множество других вершин, которые все равны по стоимости, то есть вес ребра для каждого пути складывается до 10. Модифицированный Dijkstra правильно производит следующий вывод (который является массивом$this->prev):

Array
(
    [A] => 
    [B] => Array
        (
            [0] => A
        )

    [C] => Array
        (
            [0] => A
        )

    [D] => Array
        (
            [0] => C
        )

    [E] => Array
        (
            [0] => C
        )

    [F] => Array
        (
            [0] => E
            [1] => D
        )

    [G] => Array
        (
            [0] => A
        )

    [H] => Array
        (
            [0] => G
        )

    [I] => Array
        (
            [0] => H
        )

    [J] => Array
        (
            [0] => B
            [1] => F
            [2] => I
        )

)

Текущий алгоритм восстановления пути Дейкстры с одним путем реализован следующим образом:

public function get($dest)
{
    $destReal = $dest;
    $path = array();
    while (isset($this->prev[$dest])) {
        array_unshift($path, $dest);
        $dest = $this->prev[$dest];
    }
    if ($dest === $this->start) {
        array_unshift($path, $dest);
    }

    return array(
        'path' => $path,
        'dist' => $this->dist[$destReal]
    );
}

Есть ли способ изменить выше, так что он возвращает мне все пути вpaths массив? Я уже думал об использовании стека или DFS, но не смог найти решение. Я также далforeach петли и рекурсия попробовать, но безрезультатно.

По сути, я хочу, чтобы результат обрабатывался следующим образом:

J соединяется с B, B соединяется с A, следовательно$paths[0] = ['J', 'B', 'A']J соединяется с F, F соединяется с E и D, следовательно, продолжается через E, не забывая возвращаться к F, затем создает другой путь через D, что приводит кpaths[1] = ['J', 'F', 'E', 'C', 'A'] а также$paths[2] = ['J', 'F', 'D', 'C', 'A']J подключается к I, я подключаюсь к H, H подключается к G и G подключается к A, в результате чего$paths[3] = ['J', 'I', 'H', 'G', 'A']

Любая помощь будет оценена!

Ответы на вопрос(2)

Ваш ответ на вопрос