弗洛伊德算法的设计使用动态规划思想。其递归式如下:
k = 0时, Aij(k) = wij(端点i到j的权重)
k > 0时, Aij(k) = min{Aijk-1), Aik(k-1)+Akj(k-1)}
Aij(k)的含义是,从i到j, 只经过结点(不含起点与终点)1,2...k的最短路径长度。递归式如何得到此处不再详述。算法实现时,我困惑于对于每一个k值,如何存储整个矩阵Aij, 难道要用node_num个二维数组?!后来想到整个算法实现过程是对k从0到node_num - 1迭代实现,每计算完图上任意两点的最短距离,则得到了当前k值的全部Aij(k),可直接用于下一次迭代,最终得到Aij(node_num - 1).
代码如下:
package algorithm;
import java.util.Scanner;
public class Floyd {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int node_num;
int[][] graph;
node_num = scan.nextInt();
graph = new int[node_num][node_num];
for(int i = 0; i < node_num; i++)
{
for(int j = 0; j < node_num; j++)
graph[i][j] = scan.nextInt();
}
scan.close();
for(int k = 0; k < node_num; k++)
{
for(int i = 0; i < node_num; i++)
{
for(int j = 0; j < node_num; j++)
graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
System.out.println(graph[0][node_num - 1]);
}
}