In
for (k = 0; k < n; ++k)
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
if (d[i][k] + d[k][j] < d[i][j])
d[i][j] = d[i][k] + d[k][j]
Самый внешний цикл k
относится к вершинам, которые могут находиться на пути между Vi
и Vj
. Итак, когда, например, k=1
, вы рассматриваете все пути между вершинами Vi
и Vj
, которые включают вершину V1
, как в
Vi .... V1 .... Vj
Что еще более важно, из этих путей вы выбираете лучший с релаксацией.
if (d[i][k] + d[k][j] < d[i][j])
d[i][j] = d[i][k] + d[k][j]
Опять же, каждая итерация фокусируется на двух вершинах Vi
и Vj
и выбирает лучший путь между ними.
В другом вашем случае, неудачном, вы не выбираете лучший среди путей между двумя фиксированными вершинами Vi
и Vj
, вместо этого вы расслабляетесь повсюду, никогда не дожидаясь достаточно времени, чтобы выяснить, какой путь между двумя установленными вершинами является правильным. Лучший.
На Geekviewpoint, сайте, на который я очень полагаюсь, они явно используют x
и v
как вершины и t
для самого внешнего цикла, что позволяет легко запомнить, что t
является временным и поэтому не является одной из конечных точек. (Хотелось бы, чтобы они на самом деле объяснили это, потому что это не очевидно для всех.)
//dynamically find the shortest distance between each pair.
for (int t = 0; t < n; t++) {
for (int v = 0; v < n; v++) {
for (int u = 0; u < n; u++) {
if (dist[v][u] > (long) dist[v][t] + dist[t][u]) {
dist[v][u] = dist[v][t] + dist[t][u];
pred[v][u] = pred[t][u];
}
}
}
}
person
Konsol Labapen
schedule
26.01.2013