Как найти все промежуточные точки в графе?

137
28 августа 2019, 07:30

Необходима помощь знатоков. Есть граф в виде матрицы смежности представленной в массиве:

[0] => Array
    (
        [0] => 0
        [1] => 5
        [2] => 8
        [3] => 0
        [4] => 0
        [5] => 0
        [6] => 0
    )
[1] => Array
    (
        [0] => 5
        [1] => 0
        [2] => 0
        [3] => 12
        [4] => 0
        [5] => 9
        [6] => 0
    )
[2] => Array
    (
        [0] => 8
        [1] => 0
        [2] => 0
        [3] => 0
        [4] => 8
        [5] => 4
        [6] => 2
    )
[3] => Array
    (
        [0] => 0
        [1] => 12
        [2] => 0
        [3] => 0
        [4] => 3
        [5] => 6
        [6] => 0
    )
[4] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 8
        [3] => 3
        [4] => 0
        [5] => 0
        [6] => 7
    )
[5] => Array
    (
        [0] => 0
        [1] => 9
        [2] => 4
        [3] => 6
        [4] => 0
        [5] => 0
        [6] => 0
    )
[6] => Array
    (
        [0] => 0
        [1] => 0
        [2] => 2
        [3] => 0
        [4] => 7
        [5] => 0
        [6] => 0
    )

А так же есть алгоритм Дейкстры в виде кода:

    $maxDist = 9999999;
// Присваивание всем точкам бесконечный вес и информации о посещении.
foreach ($data as $key=>$i){
    $distance[$key] = $maxDist;
    $visited[$key] = false;
}
// Обозначение начальной точки 
$distance[$start] = 0;
for ($count = 0; $count < count($matrix); $count++) {
    $min = $maxDist;
    // Поиск точки с минимальным весом
    for ($i = 0; $i < count($matrix); $i++){
        if (!$visited[$i] && $distance[$i] <= $min) {
            $min = $distance[$i];
            $index = $i;
        }
    }
    $u = $index;
    $visited[$u] = true; // Обозначение посещенной точки
    // Поиск наименьшего пути к точке.
    for ($i = 0; $i < count($matrix); $i++){
        if(!$visited[$i] && $matrix[$u][$i] != 0 && $distance[$u] + $matrix[$u][$i] < $distance[$i]) {
            $distance[$i] = $distance[$u] + $matrix[$u][$i];
        } 
    }       
}

Данный код ищет кротчайшие пути ко всем точкам из начальной точки, однако необходимо задать и конечную точку и вывести список всех промежуточных точек, от начальной точки до конечной. Вопрос состоит в том, как найти список промежуточных точек? Заранее спасибо.

Answer 1

Вот в тот момент, когда определяется кратчайший путь, нужно заодно записать в дополнительное поле для $i-го узла, откуда в него было выгоднее прийти - из $u - а в конце размотать путь назад.

if(!$visited[$i] && $matrix[$u][$i] != 0 && $distance[$u] + $matrix[$u][$i] < $distance[$i]) {
        $distance[$i] = $distance[$u] + $matrix[$u][$i];
        $best[$i] = $u;
    }
READ ALSO
Ошибка при настройке темы

Ошибка при настройке темы

При попытке настроить тему выдает ошибку

120
ajax и 500 error

ajax и 500 error

Впервые пробую создать отправку формы через AJAX и получаю 500 ошибку сервераЗнаю, что подобные темы уже есть и много, но полезного ничего не подчерпнул

131
Какие виды защиты нужны для финансового сайта с балансом, помимо защит от xss, csrf и frode атак? [закрыт]

Какие виды защиты нужны для финансового сайта с балансом, помимо защит от xss, csrf и frode атак? [закрыт]

Хочется исключить взломы баланса и покупокКакие есть еще способы атак на финансовые сайты помимо перечисленных и как от них защититься?

126
Замена картинок | preg_replace PHP

Замена картинок | preg_replace PHP

Не получается написать регулярное выражение, которое заменяло бы все пути с картинкамиКод:

113