Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。
Floyd算法能够处理带负权重的边的有向图但不能包含负权重环。
算法的基本思想是:从起始顶点开始,依次加入一个顶点,每加入一个顶点,更新一下各条最短路径长度。各条最短路径长度保存在一个二位数组中。
for (int i = 0; i < V; i++) {
for (int v = 0; v < V; v++) {
if (edgeTo[v][i] == null) continue; // 优化
for (int w = 0; w < V; w++) {
if (distTo[v][w] > distTo[v][i] + distTo[i][w]) {
distTo[v][w] = distTo[v][i] + distTo[i][w];
edgeTo[v][w] = edgeTo[i][w];
}
}
// 检查负循环
if (distTo[v][v] < 0.0) {
hasNegativeCycle = true;
return;
}
}
}