最短路(二) All Pairs
与单起点的问题不同,这类问题需要同时求解出该图中任意两点间的最短路径。
Floyd Warshall Algorithm
动态规划的想法,记录P为从点i到点j满足路上所有点都在 V k V^k Vk中的最短路,与在 V k − 1 V^{k-1} Vk−1上的子问题相比有两种可能,
- 点k不在P上,此时最短路为 V k − 1 V^{k-1} Vk−1中的最短路
- 点k在P上,此时最短路为i到k的最短路加上k到j的最短路
该算法可以通过判断距离矩阵结果中i到i的距离是否为0来检查是否存在权重和为负的圈。
代码
public static long[][] floydWarshallAlgo(int[][] graph) {
long[][] dist = new long[graph.length][graph[0].length];
for (int i = 0; i < graph.length; i++) {
for (int j = 0; j < graph[0].length; j++) {
dist[i][j] = graph[i][j];
}
}
for (int k = 0; k < graph.length; k++) {
for (int i = 0; i < graph.length; i++) {
for (int j = 0; j < graph[0].length; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}