Алгоритм Флойда (кратчайшие пути)

По сути, мне поручено реализовать алгоритм Флойда, чтобы найти кратчайший путь матрицы. Значение, в моем случае, arg, принимается, и матрица становится размером arg * arg. Следующая строка значений применяется к матрице в полученном порядке. Наконец, -1 представляет бесконечность.

Честно говоря, я понятия не имею, где возникает моя проблема. Когда проходили тесты, первая пара проходит, а остальные терпят неудачу. Я опубликую только первые две ошибки вместе с пропусками. Я просто выложу соответствующий сегмент кода.

int arg, var, i, j;

cin >> arg;

int arr[arg][arg];

for (i = 0; i < arg; i++)
{
for(j = 0; j < arg; j++)
{
cin >> var;
arr[i][j] = var;
}
}for(int pivot = 0; pivot < arg; pivot++)
{
for(i = 0; i < arg; i++)
{
for(j = 0; j < arg; j++)
{
if((arr[i][j] > (arr[i][pivot] + arr[pivot][j])) && ((arr[i][pivot] != -1) && arr[pivot][j] != -1))
{
arr[i][j] = (arr[i][pivot] + arr[pivot][j]);
arr[j][i] = (arr[i][pivot] + arr[pivot][j]);
}
}
}
}

И вот неудачи, которые я получаю. Остальные становятся длиннее и длиннее, вплоть до матрицы 20 * 20, поэтому я избавлю вас от этого:

floyd>
* * * Program successfully started and correct prompt received.

floyd 2 0 14 14 0
0 14 14 0
floyd>   PASS  : Input "floyd 2 0 14 14 0" produced output "0 14 14 0".

floyd 3 0 85 85 85 0 26 85 26 0
0 85 85 85 0 26 85 26 0
floyd>   PASS  : Input "floyd 3 0 85 85 85 0 26 85 26 0" produced output "0 85 85 85 0 26 85 26 0".

floyd 3 0 34 7 34 0 -1 7 -1 0
0 34 7 34 0 -1 7 -1 0
floyd>   FAIL  : Input "floyd 3 0 34 7 34 0 -1 7 -1 0" did not produce output "0 34 7 34 0 41 7 41 0".

floyd 4 0 -1 27 98 -1 0 41 74 27 41 0 41 98 74 41 0
0 -1 27 68 -1 0 41 74 27 41 0 41 68 74 41 0
floyd>   FAIL  : Input "floyd 4 0 -1 27 98 -1 0 41 74 27 41 0 41 98 74 41 0" did not produce output "0 68 27 68 68 0 41 74 27 41 0 41 68 74 41 0".

0

Решение

Представьте ситуацию arr[i][j] == -1очевидно (arr[i][j] > (arr[i][pivot] + arr[pivot][j])) && ((arr[i][pivot] != -1) && arr[pivot][j] != -1) терпит неудачу, но это не должно быть, если arr[i][pivot] а также arr[pivot][j] не -1

Так как вы используете -1 вместо бесконечности нужно иметь что-то вроде if ((arr[i][j] == -1 || arr[i][j] > (arr[i][pivot] + arr[pivot][j])) && ((arr[i][pivot] != -1) && arr[pivot][j] != -1)) то есть вы проверяете 2 вещи: первая — ваше состояние, а вторая — ситуация, когда arr[i][j] бесконечность и путь через pivot существует, так как в этом случае любой допустимый путь меньше бесконечности.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]