организация цикла в алгоритме Флойда
У меня вопрос по поводу организации цикла в алгоритме Флойда , какие условия нужно предусмотреть для графа n*n , если не сложно : обьясните для чего нужна дополнительная матрица в методе , не совсем понятно , вот мой код (-1 означает что дороги из одного узла в другой напрямую нету , граф ориентированный):
void Floyd_Algorithm(int** A, int size)
{
for (int k = 0; k < size; k++) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (A[i][k] > -1 && A[k][j] > -1)
{
A[i][j] = min(A[i][j], A[i][k] + A[k][j]);
}
}
}
}
}
Ответы (1 шт):
Потому что ваш код изменяет значения матрицы, и в результате использует для вычисления не исходные значения, а уже измененные - и тем самым получает неверные значения...
Покажу на более простом примере - например, для массива надо вычислить новый массив, в котором на каждом месте стоит сумма этого элемента и предшествующего. Например, для
1 2 3 1 4 6 ...
надо получить
1 3 5 4 5 10 ...
А теперь представьте, что вы записываете результаты в тот же массив
1 3
а теперь не 5, а уже 6, потому что теперь второй элемент уже не 2, а 3...
1 3 6
а следующий элемент не 4 (1+3), а уже 1+6 = 7...
Так понятно, почему нужна дополнительная матрица?