1. Floyd算法是用来解决全源最短路径的问题,即给定图G(V,E),求任意两点u,v之间的最短路径长度,算法的思想比较简单,如果存在顶点k,使得以k作为中间顶点时顶点i和顶点j的当前最短距离缩短,则将dis[i][j]更新为dis[i][k] + dis[k][j],由于存在三层循环所以时间复杂度是O(n ^ 3),n为顶点的数量
2. 需要注意的问题是最外层的k循环不能够放入到最里面,因为后面的有可能更新到某一个顶点的时候,前面的顶点i,j顶点已经访问过了,所以不能够再访问了导致有的结果是错误的,所以k循环要放到最外面
下面是有向有权图的例子:
3. 具体的代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class Floyd算法 {
static int d[][];
static int n = 0;
static int edges;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入顶点的个数: ");
n = sc.nextInt();
d = new int[n][n];
System.out.println("输入边的条数: ");
edges = sc.nextInt();
for(int i = 0; i < n; i++){
Arrays.fill(d[i], 100000);
}
for(int i = 0; i < n; i++){
//顶点到自身的距离的长度是0
d[i][i] = 0;
}
System.out.println("输入边的起始顶点, 结束顶点和边的权重: ");
for(int i = 0; i < edges; i++){
int start = sc.nextInt();
int end = sc.nextInt();
d[start][end] = sc.nextInt();
}
Floyd();
for(int i = 0; i < d.length; i++){
for(int j = 0; j < d.length; j++){
System.out.print(d[i][j] + " ");
}
System.out.println();
}
sc.close();
}
private static void Floyd() {
for(int k = 0; k < n; k++){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(d[i][k] != 0 && d[k][j] != 0 && d[i][k] + d[k][j] < d[i][j]){
d[i][j] = d[i][k] + d[k][j];
}
}
}
}
}
}