Алгоритм Флойда,вывод матрицы расстояний

110
22 апреля 2022, 08:10

Реализовал алгоритм Флойда, но задался вопросом,как сделать помимо вывода матрицы кратчайших путей, ещё и вывод матрицы расстояний, который показывает через какие точки нужно пройти,чтобы получился кратчайший путь. (Пример как выглядит матрица расстояний на скрине)

#include <iostream>
using namespace std;
int** mas = NULL;
int kol = 0;  
//вычисление минимального пути по Флойду
void minFL(int** m, int kl) 
{
    for (int k = 0; k < kl; k++) {
            for (int i = 0; i < kl; i++) {
            for (int j = 0; j < kl; j++) {
                if(m[i][j]>m[i][k]+m[k][j])
                {
                    m[i][j] = m[i][k] + m[k][j];
                }
            }
        }
    }
}
int main()
{
    setlocale(LC_ALL, "ru");
    cout << "Введите число вершин графа" << endl;
    cin >> kol;
    if (kol < 1) {
        return 0;
    }
    mas = new int* [kol];
    for (int i = 0; i < kol; i++) mas[i] = new int[kol];
    cout << "Введите матрицу смежности графа:" << endl;
   for (int i = 0; i < kol; i++)
        for (int j = 0; j < kol; j++) cin >> mas[i][j];
    minFL(mas, kol);
    cout << "Минимальные пути между вершинами:" << endl;
    for (int i = 0; i < kol; i++) {
        for (int j = 0; j < kol; j++) {
            cout << mas[i][j] << "  ";
        }
        cout << endl;
    }
    return 0;

Answer 1

Создайте массив для лучших соседей такого же размера.

В блоке оператора if рядом с обновлением m[i][j] добавьте

best[i][j] = best[i][k]

По окончанию работы основного алгоритма для данной пары вершин a,b пройдите от best[a][b], пока не упрётесь в b.

Пояснение: best[a][b] хранит вершину, в которую нужно пойти из вершины a, чтобы достичь b оптимально. Если мы перешли в вершину с, то теперь best[с][b] хранит вершину, в которую нужно пойти из вершины с, чтобы достичь b оптимально.

Начальная инициализация best - для каждой вершины best[a][a] = a, для ребра a-b best[a][b] = b, остальное заполнить спецзначением (например, -1)

Wiki

READ ALSO
Как работают модули из c++20?

Как работают модули из c++20?

Решил таки посмотреть, какие изменения были введены в 20-ом стандарде и одно из первых изменений поставило меня в тупик: модулиЯ долго пытался...

145
не запускается программа на c++

не запускается программа на c++

компилятор выдает ошибки: maincpp:34:21: error: expected ‘;’ before string constant cout « "\n x=" « x « " y=" « y « " a=" « a « " с=" « с « " U=" « U; ^~~~~~~ main

100
Как скомпилировать проект с несколькими файлами в Sublime Text 3

Как скомпилировать проект с несколькими файлами в Sublime Text 3

Подскажите как я могу компилировать проекты в Sublime Text 3Пытался настроить "Build System" файл, но безрезультатно

181